refactor: restructure weekly analysis to analyst-style trend brief (#144)

* Scribe: Archive team sync — merge decisions inbox, trim Leela history - Merged 4 inbox decision files into .squad/decisions.md (Farnsworth: correlations/divergence/no-ai narratives; Leela: CI self-learning pipeline) - Cleared .squad/decisions/inbox/ (deleted leela-ci-self-learning.md; others not tracked) - Trimmed .squad/agents/leela/history.md from 15.9KB to 3.2KB (archived to history-archive.md) - Updated both agent histories with team sync completion record - Scribe tasks: PRE-CHECK (31.4KB decisions), ARCHIVE (none older than 30d), INBOX (4 files merged), LOG written, CROSS-AGENT appended, SUMMARIZATION executed Measured outcomes: - Before: decisions.md 31436B, inbox 4 files, Leela history 15927B - After: decisions.md (merged), inbox 0 files, Leela history 3183B, archive created - All squad/ changes staged and clean for commit Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix: use agent name not path in --agent flag The Copilot CLI --agent flag takes the agent name from YAML frontmatter, not a file path. Changed from '.github/agents/farnsworth.agent.md' to 'Farnsworth' in both the analysis and reskill jobs. Also simplified the -p prompts since the agent file already contains full identity and instructions. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix: use --agent squad with Farnsworth prompt in CI The --agent flag takes the agent name, not a file path. Use 'squad' to load the Squad coordinator, then address Farnsworth in the prompt to route the analysis work. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * refactor: restructure weekly analysis output to Gartner-style trend brief Replace repo-listing section structure with editorial trend brief format: - ## This Week's Trends (3-5 named macro trends with significance) - ## Where Industry Meets Code (press vs developer activity, not ML-sounding) - ## Signal & Noise (integrated prose, no mandatory sub-headings) - ## Blind Spots (replaces What's Missing/Gaps) - ## The Week Ahead (forward-looking close, replaces Conclusion) - ## Key References / ### Notable Projects / ### Press & Industry Key changes: - prompts/analyze-weekly.md: full rewrite of section structure and output template - docs/analysis-spec.md: updated required body structure and section guidance - scripts/analysis_gate.py: updated REQUIRED_HEADINGS list - scripts/analyze_fallback.py: updated fallback template to new headings - scripts/generate_rollups.py: backward-compat extraction (new headings first, falls back to old for existing analyzed files) - All 5 affected test files updated; 519 tests pass Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * docs: Merge article restructure decision, update agent histories - Merged Leela's article structure proposal with Farnsworth's implementation into decisions.md - Updated decision from "Proposed" to "Implemented" status - Cleared 2 inbox files after merge - Appended session notes to Leela and Farnsworth histories Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * docs: Merge article restructure decision, update agent histories - Merged Leela's article structure proposal with Farnsworth's implementation into decisions.md - Updated decision from 'Proposed' to 'Implemented' status - Cleared 2 inbox files after merge - Appended session notes to Leela and Farnsworth histories Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix: address rubber-duck review findings for article restructure - Add missing unittest.mock import in test_generate_rollups.py - Guard blank 'Friction noted' lines in yearly rollups for new-format articles - Update Hugo archetype to new article section structure - Update rollout-checklist.md to reference new headings Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

Juan Manuel Servera committed May 20, 2026 at 19:56 UTC af8e9c3c10ed8076d77e41083545a50c39628540
14 files changed +260 -200
.squad/agents/farnsworth/history.md
+1
@@ -30,3 +30,4 @@
30 - **2026-05-19T21:24:54+02:00:** Divergence reader-mode upgraded from bullet lists to narrative paragraphs. `format_divergences(reader_mode=True)` now calls `_format_unpublicized_narrative()` and `_format_uncovered_narrative()` — deterministic template-driven prose (no LLM), capped at top 6 topics (by star count) and 5 uncovered trends. Repo links use only the repo name part after `/` (e.g., `[wasm-lib](https://github.com/org/wasm-lib)`). AI-mode format (reader_mode=False) is unchanged. Key insight: for reader-facing output, the data shape matters less than telling a coherent story — aggregate by topic, link to repos by short name, conclude with interpretation. 499 tests pass.
31 - **2026-05-19T22:52:54+02:00:** Fixed two reader-mode polish issues and reskill 403 crash (PR #139). (1) Count header `N repos have press correlation:` stripped in reader_mode via `re.sub` — it was an AI-prompt artefact leaking into the published page. (2) `_extract_readme_description()` now trims every candidate line to the last sentence boundary (`.` `!` `?` followed by space or end); lines with no boundary are skipped entirely, so truncated snippets never produce half-sentences. The 150-char upper bound was removed — sentence trimming makes it redundant. (3) `reskill.py main()` now catches `RuntimeError` from `call_github_models()` and writes a placeholder report instead of crashing — the job exits 0 even when the configured model (`openai/gpt-4.1`) returns 403. Key lesson: template-rendered content always needs an explicit pass to strip AI-only fields when switching to reader mode — simply replacing the list with narrative paragraphs is not enough if the surrounding template text still contains prompt tokens. 519 tests pass.
32 - **2026-05-19T20:57:55Z:** PR #139 merged. Correlation Summary section now renders as narrative prose in reader_mode (Decision recorded in `.squad/decisions.md`). Groups correlations by organization, ranks by aggregate confidence, fetches README snippets for top 2 repos per group (max 6 total), produces 1–3 interpretive paragraphs with inline links. Graceful failure on README timeout (5s). Key rationale: raw repo names with scores communicate data but not meaning; narrative format helps readers understand organizational impact. AI-mode output unchanged. Additionally: reskill job now catches RuntimeError on model 403, emits placeholder report, exits cleanly. Related decisions: `_format_correlations_narrative()` function pattern, README fetch timeout strategy, segment-by-org grouping logic. All new code covered by tests; 513 total pass.
33 +- **2026-05-20T19:15:53.942+02:00:** Article structure restructured from repo-listing format to Gartner/McKinsey-style trend brief (requested by jmservera). New section order: `## This Week's Trends` → `## Where Industry Meets Code` → `## Signal & Noise` → `## Blind Spots` → `## The Week Ahead` → `## Key References` (with `### Notable Projects` and `### Press & Industry`). Key design decisions: (1) Lead with named macro trends — 3-5 synthesized themes, not repo lists. (2) "Where Industry Meets Code" replaces "Industry & Press Correlation" — editorial framing, not ML-sounding. (3) Signal & Noise merged into integrated prose section (no `### Signal`/`### Noise` sub-headings) for better editorial writing. (4) Repos move to `### Notable Projects` at end as references, freeing body prose to cite them as evidence rather than leading with them. (5) `generate_rollups.py` updated with backward compat — tries new heading names first, falls back to old for existing `2026-W21-summary.md`. Files changed: `prompts/analyze-weekly.md`, `docs/analysis-spec.md`, `scripts/analysis_gate.py`, `scripts/analyze_fallback.py`, `scripts/generate_rollups.py`, 5 test files. All 519 tests pass. Decision filed at `.squad/decisions/inbox/farnsworth-article-restructure.md`.
.squad/decisions.md
+41
@@ -915,3 +915,44 @@ The existing prompt templates (`prompts/analyze-weekly.md`, `prompts/reskill.md`
915 - All meaningful changes require team consensus
916 - Document architectural decisions here
917 - Keep history focused on work, decisions focused on direction
918 +
919 +## Weekly Analysis Article Restructure
920 +
921 +**Date:** 2026-05-20T19:15:53.942+02:00
922 +**Author:** Leela (Lead/Architect) — Proposed; Farnsworth (Analyst) — Implemented
923 +**Status:** Implemented
924 +**Requested by:** jmservera
925 +
926 +### Context
927 +
928 +The weekly analysis output was structured like a repo-listing document (Notable New Repositories, Trending This Week, etc.). User requested a restructure to read like a Gartner/McKinsey-style trend insight brief.
929 +
930 +### Decision
931 +
932 +Replace the six-section repo-listing structure with a six-section editorial structure:
933 +
934 +| Old Section | New Section |
935 +|---|---|
936 +| `## Notable New Repositories` | (moved to `### Notable Projects` under Key References) |
937 +| `## Trending This Week` | (rolled into `## This Week's Trends`) |
938 +| `## Industry & Press Correlation` | `## Where Industry Meets Code` |
939 +| `## Trend Analysis` / `### Signal` / `### Noise` | `## Signal & Noise` (integrated prose, no sub-headings) |
940 +| `## What's Missing` / `### Gaps` | `## Blind Spots` |
941 +| `## Conclusion` | `## The Week Ahead` |
942 +| _(new)_ | `## Key References` / `### Notable Projects` / `### Press & Industry` |
943 +
944 +### Rationale
945 +
946 +1. Lead with synthesis, not inventory.
947 +2. Comparative press analysis gets its own section.
948 +3. Signal & Noise integrated (no mandatory sub-headings).
949 +4. Key References at the end (scannable).
950 +5. Forward-looking close ("The Week Ahead").
951 +
952 +### Implementation
953 +
954 +**Files Changed:** `prompts/analyze-weekly.md`, `docs/analysis-spec.md`, `scripts/analysis_gate.py`, `scripts/analyze_fallback.py`, `scripts/generate_rollups.py`, 5 test files.
955 +
956 +**Backward Compatibility:** `generate_rollups.py` tries new heading names first and falls back to old names. All frontmatter fields, repo link format, quality_score gate, and body word count rules unchanged.
957 +
958 +**Outcome:** All 519 tests pass with new structure.
archetypes/weekly.md
+8 -12
@@ -11,22 +11,18 @@ summary: ""
11 draft: true
12 ---
13
14 -## Notable New Repositories
14 +## This Week's Trends
15
16 -- Add the standout launches from this week.
16 +## Where Industry Meets Code
17
18 -## Trending This Week
18 +## Signal & Noise
19
20 -- Explain which projects gained attention and why.
20 +## Blind Spots
21
22 -## Trend Analysis
22 +## The Week Ahead
23
24 -Summarize the broader technical patterns behind the week's movement.
24 +## Key References
25
26 -## What's Missing
26 +### Notable Projects
27
28 -Call out important gaps, blind spots, or themes that did not get enough attention.
29 -
30 -## Conclusion
31 -
32 -Close with the practical takeaway for readers following GitHub's evolving signal.
28 +### Press & Industry
docs/analysis-spec.md
+47 -41
@@ -213,18 +213,19 @@ No extra frontmatter keys should be emitted unless a later decision extends this
213 The body must follow this exact top-level section order:
214
215 ```md
216 -## Notable New Repositories
216 +## This Week's Trends
217
218 -## Trending This Week
218 +## Where Industry Meets Code
219
220 -## Trend Analysis
221 -### Signal
222 -### Noise
220 +## Signal & Noise
221
224 -## What's Missing
225 -### Gaps
222 +## Blind Spots
223
227 -## Conclusion
224 +## The Week Ahead
225 +
226 +## Key References
227 +### Notable Projects
228 +### Press & Industry
229 ```
230
231 Every repository mentioned in the body must be rendered as a clickable markdown link in this exact format: `[owner/repo](https://github.com/owner/repo)`.
@@ -240,45 +241,50 @@ If an analysis ever includes an image, chart, or screenshot:
241
242 ### Section guidance
243
243 -#### 1. Notable New Repositories
244 -- **Purpose:** Curate the week’s most credible new launches.
245 -- **Include:** 3-7 repos, grouped into a coherent story rather than a bullet dump.
244 +#### 1. This Week's Trends
245 +- **Purpose:** Name and explain the week's 3-5 macro trends — the big themes that cut across individual repos.
246 +- **Include:** A clear name for each trend, what is driving it, and its significance to practitioners. Reference specific repos as evidence.
247 - **Repo links:** Every repo mention must use `[owner/repo](https://github.com/owner/repo)`.
247 -- **Tone:** Selective and judgmental.
248 -- **Length:** ~120-220 words.
249 -- **Avoid:** Exhaustive listings or copy/pasted repo descriptions.
248 +- **Tone:** Analytical and opinionated — write like a Gartner analyst, not a GitHub trending page.
249 +- **Length:** ~200-350 words.
250 +- **Avoid:** Listing repos without synthesis. Every repo reference must support a named trend.
251
251 -#### 2. Trending This Week
252 -- **Purpose:** Explain where attention moved.
253 -- **Include:** The most relevant momentum winners, plus a caveat if `stars_gained` is unavailable.
252 +#### 2. Where Industry Meets Code
253 +- **Purpose:** Compare press coverage against what developers are actually building.
254 +- **Include:** 2-4 correlations (where press and dev activity align) and 2-3 divergences (media-covered topics with no dev traction, and developer movements the press is ignoring). If no press data was available, state that explicitly.
255 - **Repo links:** Every repo mention must use `[owner/repo](https://github.com/owner/repo)`.
255 -- **Tone:** Analytical, not celebratory.
256 -- **Length:** ~100-180 words.
257 -- **Avoid:** Treating raw popularity as momentum when deltas are missing.
258 -
259 -#### 3. Trend Analysis
260 -- **Purpose:** Explain the bigger technical story.
261 -- **Required subsections:**
262 - - `### Signal` — what looks durable or strategically important.
263 - - `### Noise` — what looks inflated, repetitive, or low-substance.
256 +- **Tone:** Editorial and skeptical — the interesting story is usually in the gap.
257 +- **Length:** ~150-250 words.
258 +- **Avoid:** Summarizing press articles without connecting them to developer evidence.
259 +
260 +#### 3. Signal & Noise
261 +- **Purpose:** Deliver integrated editorial judgment on what is real versus hype.
262 +- **Required:** Write as coherent prose — do **not** use `### Signal` and `### Noise` sub-headings. The distinction should emerge from the writing itself.
263 +- **Include:** Durable, technically credible patterns (signal) and inflated, copycat, or marketing-driven patterns (noise). Name specific repos and patterns in both categories.
264 - **Repo links:** Every repo mention must use `[owner/repo](https://github.com/owner/repo)`.
265 -- **Length:** ~150-260 words total.
266 -- **Avoid:** Repeating section 1 and section 2 without synthesis.
265 +- **Length:** ~150-260 words.
266 +- **Avoid:** Repeating trend descriptions from section 1 without adding critical judgment.
267
268 -#### 4. What's Missing
269 -- **Purpose:** Surface absent or underweighted themes.
270 -- **Required subsection:** `### Gaps`.
271 -- **Include:** 2-4 concrete blind spots or underserved categories.
268 +#### 4. Blind Spots
269 +- **Purpose:** Surface what is absent from both press coverage and developer activity.
270 +- **Include:** 2-4 specific, concrete blind spots — name the missing category, why it matters, and what its absence signals.
271 - **Repo links:** Every repo mention must use `[owner/repo](https://github.com/owner/repo)`.
272 - **Length:** ~80-160 words.
274 -- **Avoid:** Generic filler like “more innovation is needed.”
273 +- **Avoid:** Generic filler like "more innovation is needed" or restating known gaps without editorial insight.
274
276 -#### 5. Conclusion
277 -- **Purpose:** End with a clear editorial takeaway.
278 -- **Include:** Why the week matters and what to watch next.
275 +#### 5. The Week Ahead
276 +- **Purpose:** End with a forward-looking editorial close.
277 +- **Include:** What trends are in motion that have not peaked yet? What should readers watch for next week? What does this week's activity suggest about where the ecosystem is heading?
278 - **Repo links:** Every repo mention must use `[owner/repo](https://github.com/owner/repo)`.
279 - **Length:** ~50-110 words.
281 -- **Avoid:** Introducing brand-new evidence.
280 +- **Avoid:** Introducing brand-new evidence or restating section 1.
281 +
282 +#### 6. Key References
283 +- **Purpose:** Give readers the 5-10 most important repos and 3-5 most relevant press items in one scannable place.
284 +- **Required subsections:** `### Notable Projects` and `### Press & Industry`.
285 +- **Notable Projects:** 5-10 repos with one sentence of context each — why it matters, not just what it is. Every repo must be a link.
286 +- **Press & Industry:** 3-5 articles or sources with markdown links. If no press data was available, write: "No press data was provided this week."
287 +- **Repo links:** Every repo mention must use `[owner/repo](https://github.com/owner/repo)`.
288
289 ## Analysis Dimensions
290
@@ -306,7 +312,7 @@ Compare the current week to the prior week when a prior summary exists. Note con
312 - Connects individual repos into ecosystem-level patterns.
313 - Names uncertainty honestly when data quality is limited.
314 - Uses evidence from the payload without sounding like the payload.
309 -- Makes the `What's Missing` section useful and specific.
315 +- Makes the `Blind Spots` section useful and specific.
316 - Leaves Amy’s generator with all frontmatter needed for site publication.
317
318 ### Bad analysis
@@ -323,8 +329,8 @@ A weekly analysis is publishable only if all of the following are true:
329
330 - `quality_score >= 60`
331 - all required frontmatter fields are present,
326 -- all five required H2 sections are present in order,
327 -- `Signal`, `Noise`, and `Gaps` subsections are present,
332 +- all six required H2 sections are present in order (`This Week's Trends`, `Where Industry Meets Code`, `Signal & Noise`, `Blind Spots`, `The Week Ahead`, `Key References`),
333 +- `### Notable Projects` and `### Press & Industry` subsections are present under `## Key References`,
334 - body word count is at least 200,
335 - the prose contains no raw JSON, tool logs, or placeholder text.
336
@@ -336,7 +342,7 @@ The generator may assume:
342 - `summary` is safe to surface in list views,
343 - `top_repo` is a deliberate editorial choice,
344 - body headings are stable and machine-detectable,
339 -- the analyzed summary and published weekly page both use `## Trending This Week` as the stable H2 heading, with any stars-gained caveat expressed in the prose rather than the heading text.
345 +- body headings use the stable structure defined in this spec; the generator can extract any section by heading name.
346
347 The analyzer may assume:
348
docs/rollout-checklist.md
+1 -1
@@ -38,7 +38,7 @@ Use this checklist to verify your SquadScope instance is ready for production. C
38 - [ ] Previous crawl completed
39 - [ ] Verify: `data/analyzed/YYYY-WNN-summary.md` exists and contains valid Markdown + YAML
40 - [ ] Check: YAML frontmatter includes `quality_score`, `title`, `date`, `categories`
41 - - [ ] Check: File contains `## Trend Analysis` with `### Signal` and `### Noise`, plus `## What's Missing` with `### Gaps`
41 + - [ ] Check: File contains `## This Week's Trends`, `## Where Industry Meets Code`, `## Signal & Noise`, `## Blind Spots`, `## The Week Ahead`, `## Key References`
42
43 - [ ] **Quality gate passed**
44 - [ ] Analysis quality_score ≥ 60 (check frontmatter)
prompts/analyze-weekly.md
+37 -39
@@ -68,7 +68,7 @@ Be critical, selective, and opinionated.
68
69 1. Use the raw JSON as the primary evidence source.
70 2. Ignore unknown JSON fields.
71 -3. If `trending_repos[*].stars_gained` is mostly missing or null, explicitly say the trending section is directionally useful but not a true momentum leaderboard yet.
71 +3. If `trending_repos[*].stars_gained` is mostly missing or null, note it where relevant in the trend discussion — do not omit the caveat but do not let it dominate the analysis.
72 4. Use `signals.top_topics` as supporting evidence, not as a substitute for judgment.
73 5. Frontmatter must include exactly these keys:
74 - `title`
@@ -92,29 +92,28 @@ Be critical, selective, and opinionated.
92 13. Include all required sections in this exact order:
93
94 ```md
95 -## Notable New Repositories
95 +## This Week's Trends
96
97 -## Trending This Week
97 +## Where Industry Meets Code
98
99 -## Industry & Press Correlation
99 +## Signal & Noise
100
101 -## Trend Analysis
102 -### Signal
103 -### Noise
101 +## Blind Spots
102
105 -## What's Missing
106 -### Gaps
103 +## The Week Ahead
104
108 -## Conclusion
105 +## Key References
106 +### Notable Projects
107 +### Press & Industry
108 ```
109
110 14. Keep the section scope aligned with the spec:
112 - - `## Notable New Repositories`: ~120-220 words, curating 3-7 repos.
113 - - `## Trending This Week`: ~100-180 words; explain where attention moved and add the stars-gained caveat when data is missing.
114 - - `## Industry & Press Correlation`: ~100-200 words. REQUIRED even if no press data is available (state that explicitly). When press data IS provided in the prompt, you MUST: (a) highlight 2-4 key correlations between GitHub activity and TechCrunch coverage, (b) call out divergences — tech trends covered by press with no matching dev activity, AND dev activity with no press coverage, (c) label repos as press-correlated vs organic growth. If no press data section appears below, write "No industry press data was available for this week's analysis."
115 - - `## Trend Analysis`: ~150-260 words total across `### Signal` and `### Noise`.
116 - - `## What's Missing`: ~80-160 words with 2-4 concrete blind spots under `### Gaps`.
117 - - `## Conclusion`: ~50-110 words focused on why the week matters and what to watch next.
111 + - `## This Week's Trends`: ~200-350 words. Name 3-5 macro trends of the week. Each trend should have a name, a 1-2 sentence explanation of what it is, and why it matters to practitioners now. Do not just list repos — synthesize across them. Reference specific repos as evidence using `[owner/repo](https://github.com/owner/repo)`.
112 + - `## Where Industry Meets Code`: ~150-250 words. Compare press coverage (TechCrunch or other provided press data) against what developers are actually building. Highlight 2-4 correlations (where press and developer activity align) and call out 2-3 divergences (topics in the press with no dev traction, and developer work the press is ignoring). If no press data was provided, state: "No industry press data was available for this week's analysis." and focus on what the developer activity alone reveals.
113 + - `## Signal & Noise`: ~150-260 words. Integrated analysis — what is real versus hype. Do not use Signal/Noise as separate sub-headings; write it as coherent editorial prose that distinguishes durable patterns from inflated, low-substance, or marketing-driven activity. Name names. Reference repos as evidence.
114 + - `## Blind Spots`: ~80-160 words. Identify 2-4 meaningful absences from both press coverage AND developer attention. Be specific and concrete — name the missing category, why it matters, and what its absence signals.
115 + - `## The Week Ahead`: ~50-110 words. Forward-looking editorial close. What should readers watch for next week? What trends are in motion that haven't peaked yet? Where is the ecosystem heading based on this week's evidence?
116 + - `## Key References` with `### Notable Projects` (5-10 most important repos with 1-sentence context each) and `### Press & Industry` (3-5 most relevant articles or sources, or "No press data was provided this week." if absent).
117 15. The body must be at least 200 words.
118 16. Do not include raw JSON, notes to self, placeholders, or tool transcripts.
119 17. Every repository reference in the body must be a clickable GitHub markdown link in this exact format: `[owner/repo](https://github.com/owner/repo)`.
@@ -122,14 +121,15 @@ Be critical, selective, and opinionated.
121
122 ## Working method
123
125 -1. Identify the strongest new-repo signals.
126 -2. Evaluate the trending set for real momentum versus incumbent popularity.
127 -3. Cluster themes across repos and topics.
128 -4. Name one or more overhyped or low-signal patterns.
129 -5. Identify concrete gaps or absences.
124 +1. Read all repo data; cluster repos into 3-5 named thematic patterns — these become the macro trends.
125 +2. Assess each trend: is it durable infrastructure work, hype-driven attention, or a meaningful ecosystem shift?
126 +3. If press data is available, cross-reference: what did TechCrunch cover and what does developer activity actually show? Surface the gap.
127 +4. Write Signal & Noise as a unified editorial judgment — what to trust, what to dismiss.
128 +5. Identify concrete gaps or absences that neither press nor developers are addressing.
129 6. Compare with the previous week if a previous summary was provided.
130 7. Apply relevant wisdom and skills where they clarify the call, but overrule them when the raw evidence says they do not fit this week.
132 -8. Produce a concise, readable editorial summary that a technical reader would actually trust.
131 +8. Select 5-10 most important repos for Key References; select 3-5 most important press items.
132 +9. Produce a brief, forward-looking close that reads like the last paragraph of a Gartner insight brief.
133
134 ## Output template
135
@@ -148,35 +148,33 @@ quality_score: 0
148 summary: "One-sentence editorial thesis."
149 ---
150
151 -## Notable New Repositories
151 +## This Week's Trends
152
153 -Write 1-2 paragraphs that curate the most credible new launches. Whenever you mention a repo, use `[owner/repo](https://github.com/owner/repo)`.
153 +Name and explain 3-5 macro trends. For each trend: give it a clear name (bold or inline is fine), explain what is driving it, and state its significance to practitioners. Use specific repos as evidence — e.g., [owner/repo](https://github.com/owner/repo) — rather than abstract claims. Keep each trend to 2-4 sentences. The goal is for a reader to scan this section and immediately understand what the week's dominant technical movements were.
154
155 -## Trending This Week
155 +## Where Industry Meets Code
156
157 -Write 1 paragraph about where attention moved. If star deltas are missing, say so clearly. Whenever you mention a repo, use `[owner/repo](https://github.com/owner/repo)`.
157 +Write 2-3 paragraphs comparing press coverage with developer activity. Where do they align? Where are they talking past each other? If press data was provided, call out which repos or topics the press covered and whether developer activity backed that coverage up. Identify the most interesting divergence — the story the press missed, or the GitHub movement that has no media narrative yet. If no press data was available, state that explicitly and explain what developer activity alone suggests about the media narrative gap. Whenever you mention a repo, use `[owner/repo](https://github.com/owner/repo)`.
158
159 -## Industry & Press Correlation
159 +## Signal & Noise
160
161 -Write 1-2 paragraphs analyzing the relationship between developer activity and industry press coverage. If press data was provided in this prompt, highlight key correlations (repos that gained stars due to press), identify divergences (press-hyped topics with no dev traction, and dev activity flying under the media radar), and label repos as 📰 Press-correlated, 🌱 Organic growth, or ⚠️ Hype risk where applicable. If no press data was provided, state: "No industry press data was available for this week's analysis."
161 +Write 2 paragraphs of integrated editorial judgment. What patterns in this week's data look durable, technically credible, and worth tracking? What looks inflated, copycat, marketing-driven, or exploit-heavy? Do not use sub-headings — this should read as coherent critical prose. Be specific: name the repos or patterns that represent signal and name the ones that represent noise. Whenever you mention a repo, use `[owner/repo](https://github.com/owner/repo)`.
162
163 -## Trend Analysis
163 +## Blind Spots
164
165 -### Signal
165 +Write 1-2 paragraphs on what is missing from both the press narrative and developer activity. Name 2-4 specific categories, problem spaces, or infrastructure needs that should be showing more energy but are not. Avoid generic filler like "more innovation is needed." Whenever you mention a repo, use `[owner/repo](https://github.com/owner/repo)`.
166
167 -Write 1 paragraph on the durable patterns. Whenever you mention a repo, use `[owner/repo](https://github.com/owner/repo)`.
167 +## The Week Ahead
168
169 -### Noise
169 +Write a short forward-looking close (3-5 sentences). What trends are in motion that have not peaked? What should technical readers watch for in the next week or two? What does this week's activity suggest about where the ecosystem is heading? Whenever you mention a repo, use `[owner/repo](https://github.com/owner/repo)`.
170
171 -Write 1 paragraph on the inflated, weak, or off-mission patterns. Whenever you mention a repo, use `[owner/repo](https://github.com/owner/repo)`.
171 +## Key References
172
173 -## What's Missing
173 +### Notable Projects
174
175 -### Gaps
175 +List 5-10 of the most important repos from this week's analysis. One sentence of context each — why it matters, not just what it is. Every repo must be a link: `[owner/repo](https://github.com/owner/repo)`.
176
177 -Write 1 paragraph on meaningful absences or underserved categories. Whenever you mention a repo, use `[owner/repo](https://github.com/owner/repo)`.
177 +### Press & Industry
178
179 -## Conclusion
180 -
181 -Write a short closing takeaway about what the week means and what to watch next. Whenever you mention a repo, use `[owner/repo](https://github.com/owner/repo)`.
179 +List 3-5 of the most relevant articles, reports, or press items referenced in this analysis. Use markdown links where URLs are available. If no press data was provided this week, write: "No press data was provided this week."
180 ```
scripts/analysis_gate.py
+8 -8
@@ -29,14 +29,14 @@ REQUIRED_FIELDS = [
29 "summary",
30 ]
31 REQUIRED_HEADINGS = [
32 - "## Notable New Repositories",
33 - "## Trending This Week",
34 - "## Trend Analysis",
35 - "### Signal",
36 - "### Noise",
37 - "## What's Missing",
38 - "### Gaps",
39 - "## Conclusion",
32 + "## This Week's Trends",
33 + "## Where Industry Meets Code",
34 + "## Signal & Noise",
35 + "## Blind Spots",
36 + "## The Week Ahead",
37 + "## Key References",
38 + "### Notable Projects",
39 + "### Press & Industry",
40 ]
41 RAW_MARKERS = [
42 "```json",
scripts/analyze_fallback.py
+17 -23
@@ -442,45 +442,39 @@ quality_score: 62
442 summary: "Automated data-only summary for {week}. AI analysis was unavailable; this report presents raw crawl statistics and top repositories without editorial commentary."
443 ---
444
445 -## Notable New Repositories
445 +## This Week's Trends
446
447 -This week the crawler captured {len(new_repos)} new repositories. The following are the highest-starred new entries, representing emerging projects and fresh launches that attracted early attention from the community.
447 +Without AI-powered analysis, this section reports observed patterns from crawl data rather than synthesized editorial trends. The top community topics this week are {topics_str}, and the dominant languages are {lang_summary}. These signals point to where developer attention is concentrated, though qualitative interpretation of which patterns are durable versus incidental requires a full AI-enabled analysis run.
448
449 -{notable_section}
450 -
451 -These repositories reflect the current interests of the developer community. The concentration of activity around {lang_summary} suggests continued investment in these technology areas. Without AI-powered analysis, editorial interpretation of these signals is deferred to the next available run.
452 -
453 -## Trending This Week
454 -
455 -The trending set includes {len(trending_repos)} repositories that were active during the crawl window. The following top entries by cumulative star count represent sustained community interest.
449 +The crawler captured {repos_featured} repositories this week ({len(new_repos)} new, {len(trending_repos)} trending) with {total_stars:,} cumulative stars. The top repository by star count is [{top_repo}](https://github.com/{top_repo}). Raw patterns suggest continued investment in {lang_summary}, but without editorial judgment these should be treated as directional rather than conclusive.
450
457 -{trending_section}
451 +## Where Industry Meets Code
452
459 -The presence of established projects alongside newer entries indicates both sustained momentum in foundational tools and growing interest in emerging categories.
453 +{_render_press_section_no_ai(press_context_path)}
454
461 -## Industry & Press Correlation
455 +## Signal & Noise
456
463 -{_render_press_section_no_ai(press_context_path)}
457 +The primary observable signal this week comes from language and topic distribution. The top languages are {lang_summary}. The top community topics are {topics_str}. These patterns indicate where developer attention is concentrating and what categories are gaining traction relative to prior weeks.
458
465 -## Trend Analysis
459 +Without AI-powered filtering, distinguishing signal from noise requires manual review. Some repositories in the crawl may represent low-quality forks, exploit tools, or promotional projects that inflate topic counts without contributing meaningful innovation. Future AI-enabled runs will provide better noise filtering and critical editorial judgment.
460
467 -### Signal
461 +## Blind Spots
462
469 -The primary signal this week comes from language and topic distribution. The top languages are {lang_summary}. The top community topics are {topics_str}. These patterns indicate where developer attention is concentrating and what categories are gaining traction relative to prior weeks.
463 +This automated summary lacks the editorial judgment that AI analysis would normally provide. Specific blind spots in this report include: comparative trend analysis against prior weeks, qualitative assessment of repository significance, identification of emerging ecosystem patterns not visible from raw metrics, and filtering of low-signal entries that inflate topic counts. The raw data is preserved for future re-analysis when AI capabilities become available.
464
471 -### Noise
465 +## The Week Ahead
466
473 -Without AI-powered filtering, distinguishing signal from noise requires manual review. Some repositories in the crawl may represent low-quality forks, exploit tools, or promotional projects that inflate topic counts without contributing meaningful innovation. Future AI-enabled runs will provide better noise filtering.
467 +Week {week_num} of {year_str} captured {repos_featured} repositories with {total_stars:,} cumulative stars tracked. The top repository is [{top_repo}](https://github.com/{top_repo}). This summary was generated without AI assistance and presents factual crawl statistics only. A full analytical run should be attempted when AI model access is restored to provide trend synthesis and editorial judgment.
468
475 -## What's Missing
469 +## Key References
470
477 -### Gaps
471 +### Notable Projects
472
479 -This automated summary lacks editorial judgment that AI analysis would normally provide. Specific gaps include: comparative trend analysis against prior weeks, qualitative assessment of repository significance, identification of emerging ecosystem patterns, and filtering of low-signal entries. The raw data is preserved for future re-analysis when AI capabilities become available.
473 +{notable_section}
474
481 -## Conclusion
475 +### Press & Industry
476
483 -Week {week_num} of {year_str} captured {repos_featured} repositories with {total_stars:,} cumulative stars tracked. The top repository by star count is [{top_repo}](https://github.com/{top_repo}). This summary was generated without AI assistance and presents factual crawl statistics only. A full analytical run should be attempted when AI model access is restored.
477 +{_render_press_section_no_ai(press_context_path) if press_context_path else "No press data was provided this week."}
478 '''
479 return markdown.strip() + "\n"
480
scripts/generate_rollups.py
+26 -9
@@ -218,11 +218,28 @@ def load_summary(path: Path) -> WeeklySummary:
218
219 date = analysis_gate.parse_datetime(frontmatter["date"])
220 month = date.month
221 - trend_analysis = get_section_text(body, "Trend Analysis")
222 - signal = get_subsection_text(trend_analysis, "Signal")
223 - noise = get_subsection_text(trend_analysis, "Noise")
224 - gaps = get_subsection_text(get_section_text(body, "What's Missing"), "Gaps")
225 - conclusion = normalize_text(get_section_text(body, "Conclusion"))
221 +
222 + # New structure: try new heading names first, fall back to old for backward compat
223 + signal_noise_section = get_section_text(body, "Signal & Noise")
224 + if signal_noise_section:
225 + signal = normalize_text(signal_noise_section)
226 + noise = ""
227 + else:
228 + trend_analysis = get_section_text(body, "Trend Analysis")
229 + signal = get_subsection_text(trend_analysis, "Signal")
230 + noise = get_subsection_text(trend_analysis, "Noise")
231 +
232 + blind_spots = get_section_text(body, "Blind Spots")
233 + if blind_spots:
234 + gaps = normalize_text(blind_spots)
235 + else:
236 + gaps = get_subsection_text(get_section_text(body, "What's Missing"), "Gaps")
237 +
238 + week_ahead = get_section_text(body, "The Week Ahead")
239 + if week_ahead:
240 + conclusion = normalize_text(week_ahead)
241 + else:
242 + conclusion = normalize_text(get_section_text(body, "Conclusion"))
243 top_repo = str(frontmatter["top_repo"])
244
245 return WeeklySummary(
@@ -276,8 +293,8 @@ def monthly_entries(weekly: WeeklySummary, tags_counter: Counter[str]) -> dict[s
293 marker=marker,
294 text=(
295 f"{marker} — {page_link}\n"
279 - f"- Signal: {weekly.signal}\n"
280 - f"- Noise: {weekly.noise}"
296 + f"- Signal: {weekly.signal}"
297 + + (f"\n- Noise: {weekly.noise}" if weekly.noise else "")
298 ),
299 ),
300 "Key Takeaways": RollupEntry(
@@ -325,8 +342,8 @@ def yearly_entries(weekly: WeeklySummary, tags_counter: Counter[str]) -> dict[st
342 "What Changed": RollupEntry(
343 marker=marker,
344 text=(
328 - f"{marker}\n"
329 - f"- Friction noted in {week_link}: {weekly.noise}"
345 + f"{marker}"
346 + + (f"\n- Friction noted in {week_link}: {weekly.noise}" if weekly.noise else "")
347 ),
348 ),
349 "Predictions Review": RollupEntry(
tests/test_analysis_gate.py
+29 -32
@@ -7,73 +7,70 @@ RAW_PAYLOAD = {"week": "2026-W21"}
7 CURRENT_DATETIME = "2026-05-18T00:00:00Z"
8
9
10 -def make_body(*, trending_heading: str = "## Trending This Week", include_todo_app: bool = False) -> str:
11 - notable = " ".join(
10 +def make_body(*, alternate_heading: str = "## Where Industry Meets Code", include_todo_app: bool = False) -> str:
11 + trends = " ".join(
12 [
13 - "This section evaluates durable launches, compares architecture choices, and explains why the strongest repositories matter for practitioners tracking real engineering movement."
13 + "This section names the macro trends of the week, explaining what is driving each pattern and why it matters to practitioners tracking real engineering movement."
14 ]
15 * 4
16 )
17 - trending = " ".join(
17 + industry = " ".join(
18 [
19 - "Attention moved toward practical tooling, but the narrative distinguishes genuine momentum from incumbents that simply remain popular because they already dominate conversation."
20 - ]
21 - * 4
22 - )
23 - signal = " ".join(
24 - [
25 - "The durable pattern is disciplined infrastructure work, careful developer experience improvements, and credible evidence that teams are solving recurring operational pain."
19 + "Developer activity and press coverage aligned around practical tooling, but the narrative reveals where media attention diverged from what engineers are actually building."
20 ]
21 * 3
22 )
29 - noise = " ".join(
23 + signal_noise = " ".join(
24 [
31 - "The weak pattern is wrapper churn, shallow agent branding, and launches that borrow attention without demonstrating technical substance or ecosystem fit."
25 + "The durable pattern is disciplined infrastructure work and credible developer experience improvements. The weak pattern is wrapper churn, shallow agent branding, and launches that borrow attention without demonstrating technical substance or ecosystem fit."
26 ]
27 * 3
28 )
35 - gaps = " ".join(
29 + blind_spots = " ".join(
30 [
31 "What is missing is more progress on observability, testing ergonomics, and dependable security tooling for smaller teams that still need production discipline."
32 ]
33 * 3
34 )
41 - conclusion = " ".join(
35 + week_ahead = " ".join(
36 [
37 "The week matters because it shows teams rewarding grounded software that reduces toil, while hype-heavy experiments still struggle to prove lasting value."
38 ]
39 * 2
40 )
41 if include_todo_app:
48 - conclusion += " Several repositories mention todo apps as legitimate examples rather than placeholder notes."
42 + week_ahead += " Several repositories mention todo apps as legitimate examples rather than placeholder notes."
43 return f"""
50 -## Notable New Repositories
44 +## This Week's Trends
45 +
46 +{trends}
47
52 -{notable}
48 +{alternate_heading}
49
54 -{trending_heading}
50 +{industry}
51
56 -{trending}
52 +## Signal & Noise
53
58 -## Trend Analysis
54 +{signal_noise}
55
60 -### Signal
56 +## Blind Spots
57
62 -{signal}
58 +{blind_spots}
59
64 -### Noise
60 +## The Week Ahead
61
66 -{noise}
62 +{week_ahead}
63
68 -## What's Missing
64 +## Key References
65
70 -### Gaps
66 +### Notable Projects
67
72 -{gaps}
68 +- [owner/repo-a](https://github.com/owner/repo-a) — anchors the automation trend with practical defaults.
69 +- [owner/repo-b](https://github.com/owner/repo-b) — observability tooling for smaller teams.
70
74 -## Conclusion
71 +### Press & Industry
72
76 -{conclusion}
73 +No press data was provided this week.
74 """.strip()
75
76
@@ -138,7 +135,7 @@ summary: "A grounded week focused on practical tools."'''.strip()
135
136 def test_validate_analysis_requires_real_heading_lines(self) -> None:
137 body = make_body(
141 - trending_heading="The prose references ## Trending This Week without creating a heading line.",
138 + alternate_heading="The prose references ## Where Industry Meets Code without creating a heading line.",
139 )
140 errors, _ = analysis_gate.validate_analysis(
141 make_analysis(VALID_FRONTMATTER, body),
@@ -146,7 +143,7 @@ summary: "A grounded week focused on practical tools."'''.strip()
143 CURRENT_DATETIME,
144 )
145
149 - self.assertIn("Missing required section heading: ## Trending This Week", errors)
146 + self.assertIn("Missing required section heading: ## Where Industry Meets Code", errors)
147
148 def test_validate_analysis_allows_legitimate_todo_mentions(self) -> None:
149 errors, _ = analysis_gate.validate_analysis(
tests/test_generate_content.py
+2 -2
@@ -27,7 +27,7 @@ quality_score: 88
27 summary: \"Agent tooling became more operational this week.\"
28 ---
29
30 -## Notable New Repositories
30 +## This Week's Trends
31
32 Body copy.
33 """,
@@ -52,7 +52,7 @@ Body copy.
52 self.assertIn('summary: "Agent tooling became more operational this week."', rendered)
53 self.assertNotIn("quality_score", rendered)
54 self.assertNotIn("year:", rendered)
55 - self.assertIn("## Notable New Repositories", rendered)
55 + self.assertIn("## This Week's Trends", rendered)
56
57 def test_find_latest_summary_uses_week_not_mtime(self) -> None:
58 tests_root = Path(__file__).resolve().parent
tests/test_generate_rollups.py
+17 -14
@@ -1,6 +1,7 @@
1 import io
2 import tempfile
3 import unittest
4 +from unittest import mock
5 from pathlib import Path
6
7 import scripts.generate_rollups as generate_rollups
@@ -42,33 +43,35 @@ summary: "{summary}"
43 stars_tracked: 1000
44 ---
45
45 -## Notable New Repositories
46 +## This Week's Trends
47
47 -{notable_new}
48 +Trend analysis for {week}. Developer activity concentrated around practical tooling and infrastructure work.
49
49 -## Trending This Week
50 +## Where Industry Meets Code
51
51 -Momentum concentrated around practical tooling.
52 +No press data available for this automated test summary. Developer activity tells a coherent story on its own.
53
53 -## Trend Analysis
54 +## Signal & Noise
55
55 -### Signal
56 +{signal} {noise}
57
57 -{signal}
58 +## Blind Spots
59
59 -### Noise
60 +{gaps}
61
61 -{noise}
62 +## The Week Ahead
63
63 -## What's Missing
64 +{conclusion}
65
65 -### Gaps
66 +## Key References
67
67 -{gaps}
68 +### Notable Projects
69
69 -## Conclusion
70 +{notable_new}
71
71 -{conclusion}
72 +### Press & Industry
73 +
74 +No press data was provided this week.
75 '''
76
77
tests/test_pipeline.py
+23 -16
@@ -117,33 +117,40 @@ quality_score: 86
117 summary: "Reliable automation and observability projects set the tone for the week."
118 ---
119
120 -## Notable New Repositories
120 +## This Week's Trends
121
122 -[octo/signal-kit](https://github.com/octo/signal-kit) stood out because it solves release coordination without pretending to be a full platform rewrite. The project packages practical automation, readable defaults, and evidence of disciplined engineering. Teams watching shipping velocity can understand why it matters in one pass, which is a stronger signal than yet another thin wrapper around generic assistants. The repo reads like operational software built for repeat use instead of launch-day theater.
122 +**Operational Automation**: Teams are investing in tools that reduce coordination overhead and improve release confidence. [octo/signal-kit](https://github.com/octo/signal-kit) exemplifies this — it solves release coordination without pretending to be a full platform rewrite. The project packages practical automation, readable defaults, and evidence of disciplined engineering.
123
124 -## Trending This Week
124 +**Observability as Infrastructure**: [octo/momentum-watch](https://github.com/octo/momentum-watch) captured attention because the work is grounded in run health and measurement rather than novelty claims. The trend matters because more teams are prioritizing incident feedback loops and durable visibility into developer workflows.
125
126 -[octo/momentum-watch](https://github.com/octo/momentum-watch) captured attention because the work is grounded in observability and run health rather than novelty claims. The weekly delta is directionally useful here, and the trend matters because more teams are prioritizing measurement, incident feedback loops, and durable visibility into developer workflows instead of vanity dashboards.
126 +## Where Industry Meets Code
127
128 -## Trend Analysis
128 +Developer activity aligned with broader industry interest in automation and observability tooling this week. Both [octo/signal-kit](https://github.com/octo/signal-kit) and [octo/momentum-watch](https://github.com/octo/momentum-watch) represent categories where press coverage and developer investment point in the same direction. The more interesting divergence is what the press is not covering: the quiet growth of practical pipeline tooling that makes releases safer without requiring major architectural changes. This type of grounded infrastructure work rarely earns headlines, but this week's developer activity suggests it is where real adoption is happening.
129
130 -### Signal
130 +## Signal & Noise
131
132 -The durable signal is a return to automation that lowers toil and gives teams more confidence in repeatable delivery. [octo/signal-kit](https://github.com/octo/signal-kit) and [octo/momentum-watch](https://github.com/octo/momentum-watch) both point toward software that reduces coordination overhead, improves trust in pipelines, and respects how operators actually work. That pattern is more convincing than broad claims about agents replacing engineering judgment.
132 +The durable signal this week is a return to automation that lowers toil and gives teams more confidence in repeatable delivery. [octo/signal-kit](https://github.com/octo/signal-kit) and [octo/momentum-watch](https://github.com/octo/momentum-watch) both point toward software that reduces coordination overhead, improves trust in pipelines, and respects how operators actually work. That pattern is more convincing than broad claims about agents replacing engineering judgment.
133
134 -### Noise
134 +The noise is the usual rush of products that market autonomy without proving fit, maintenance discipline, or measurable outcomes. This week was healthier than most, but the broader ecosystem still produces wrappers that borrow the language of automation while skipping the hard parts of observability, testing, and operational ownership.
135
136 -The weak signal is the usual rush of products that market autonomy without proving fit, maintenance discipline, or measurable outcomes. This week was healthier than most, but the broader ecosystem still produces wrappers that borrow the language of automation while skipping the hard parts of observability, testing, and operational ownership.
136 +## Blind Spots
137
138 -## What's Missing
138 +The biggest blind spot is stronger investment in security review, test ergonomics, and smaller-team operations tooling that can be adopted without a platform migration. The ecosystem is getting better at coordination, but it still underserves practical defensive tooling and deployment confidence for teams that need reliability before they need spectacle. Neither press nor developer communities are giving this the attention it deserves.
139
140 -### Gaps
140 +## The Week Ahead
141
142 -The biggest gap is stronger investment in security review, test ergonomics, and smaller-team operations tooling that can be adopted without a platform migration. The ecosystem is getting better at coordination, but it still underserves practical defensive tooling and deployment confidence for teams that need reliability before they need spectacle.
142 +Practical automation won attention on merit this week. If this pattern holds, the next wave of winners will be tools that save teams time, expose real operating signals, and make release quality easier to trust. Watch for observability and pipeline safety tooling to continue gaining ground.
143
144 -## Conclusion
144 +## Key References
145
146 -The week matters because practical automation won attention on merit. If this pattern holds, the next wave of winners will be tools that save teams time, expose real operating signals, and make release quality easier to trust.
146 +### Notable Projects
147 +
148 +- [octo/signal-kit](https://github.com/octo/signal-kit) — release coordination automation with practical defaults and disciplined engineering.
149 +- [octo/momentum-watch](https://github.com/octo/momentum-watch) — observability tooling grounded in run health rather than vanity metrics.
150 +
151 +### Press & Industry
152 +
153 +No press data was provided this week.
154 '''
155
156
@@ -357,7 +364,7 @@ class PipelineIntegrationTests(unittest.TestCase):
364 self.assertIn('week: "2026-W21"', rendered)
365 self.assertIn("draft: false", rendered)
366 self.assertNotIn("quality_score", rendered)
360 - self.assertIn("## Notable New Repositories", rendered)
367 + self.assertIn("## This Week's Trends", rendered)
368
369 def test_analyze_fallback_can_process_raw_data(self) -> None:
370 tests_root = Path(__file__).resolve().parent
@@ -392,7 +399,7 @@ class PipelineIntegrationTests(unittest.TestCase):
399 self.assertEqual(exit_code, 0)
400 written = output_path.read_text(encoding="utf-8")
401 self.assertIn("Week 21, 2026 Analysis", written)
395 - self.assertIn("## Trend Analysis", written)
402 + self.assertIn("## Signal & Noise", written)
403
404 def test_analysis_gate_validates_analysis_output_correctly(self) -> None:
405 tests_root = Path(__file__).resolve().parent
tests/test_prediction_ledger.py
+3 -3
@@ -38,9 +38,9 @@ quality_score: 76
38 summary: "Strong week for agent tooling."
39 ---
40
41 -## Notable New Repositories
41 +## This Week's Trends
42
43 -[vercel-labs/zero](https://github.com/vercel-labs/zero) is the top new repo.
43 +[vercel-labs/zero](https://github.com/vercel-labs/zero) led this week as a standout new AI infrastructure repo.
44 Also notable: [org/rising-repo](https://github.com/org/rising-repo) and
45 [bigcorp/established](https://github.com/bigcorp/established).
46 """
@@ -115,7 +115,7 @@ class TestParseSummary:
115
116 def test_parses_body(self):
117 result = parse_summary(SAMPLE_SUMMARY)
118 - assert "Notable New Repositories" in result["body"]
118 + assert "This Week's Trends" in result["body"]
119
120 def test_handles_no_frontmatter(self):
121 result = parse_summary("# Just a header\nSome content.")