| 1 | # Fry — History |
| 2 | |
| 3 | ## Core Context |
| 4 | - Owns pipeline validation across crawling, analysis, and publication. |
| 5 | - Uses test coverage to keep workflow changes honest. |
| 6 | |
| 7 | ## Learnings |
| 8 | - 2026-06-07T21:42:28.011+00:00: Podcaster handoff QA passed local mock dry-run and full tests without exposing secrets; Actions has Podcaster endpoint/key configured by presence only, but the current workflow has no safe live Podcaster dry-run path because dry-run/candidate-only skip `podcaster-handoff` and normal/force-replace can mutate production content. |
| 9 | - 2026-06-07T21:42:28.011+00:00: Issue #302 handoff readiness landed in PR #314: the `podcaster-handoff` job now declares `needs: [analyze, generate, deploy]` so it waits for the Pages deploy, the payload carries publish run ID (`--publish-run-id`) and publish mode (`--publish-mode`), and the job runs with `continue-on-error: true` so Podcaster errors no longer fail the weekly workflow. Remaining note: the handoff is still an in-workflow job rather than a separate post-success workflow. |
| 10 | - 2026-06-05T15:36:19.379+00:00: The weekly crawl pipeline needs a terminal data-only no-AI analysis fallback after Copilot and GitHub Models fail, because model-access errors such as `no_access` are real reliability bugs, not transient deploy noise. |
| 11 | - The PaperMod theme in this repo needs Hugo `v0.146.0+`, so build validation must use a sufficiently new Hugo binary. |
| 12 | - End-to-end checks matter more than isolated unit confidence when artifacts move across crawl, analyze, and publish stages. |
| 13 | - Raw crawl output can be publishable with curation, but trend filters still need skepticism about exploit noise and weak momentum data. |
| 14 | - 2026-06-01: Issue #217 came from the analysis stage: Copilot retries could fail the tightened gate with generic week-title output or missing files, so the prompt now injects concrete week/year values, the workflow falls back to GitHub Models after Copilot gate failures, and `scripts/analyze_fallback.py` now works when invoked exactly as CI runs it. |
| 15 | - 2026-06-01: Issue #220 came from the generate stage: `generate_content.py` emits an absolute `page_path`, but the publish-branch commit step treated it as `content/weekly/...`, so the restore `cp` doubled the path and failed. The crawl workflow also had no failure-issue job, so generate/deploy failures were silent unless someone checked Actions manually. |
| 16 | |
| 17 | ## Round 2026-06-01T12:19 |
| 18 | |
| 19 | ### Issue #217: Quality Gates |
| 20 | - PR #218 opened with all tests passing |
| 21 | - Fallback mechanism now includes GitHub Models support |
| 22 | - Copilot prompt validation hardened |
| 23 | |
| 24 | ## Round 2026-06-01T12:41 |
| 25 | |
| 26 | ### PR #218 Merged |
| 27 | - Review comment resolved: removed outer quotes from YAML title hint |
| 28 | - Added regression test |
| 29 | - 542 tests passing |
| 30 | - Commit 9d15b18 |
| 31 | - Merged (squash) |
| 32 | - Issue #217 closed |
| 33 | |
| 34 | ## Round 2026-06-01T15:40 |
| 35 | |
| 36 | ### Issue #38: Anticipatory Tests |
| 37 | - Branch `squad/38-hindsight-tests` pushed |
| 38 | - Generated comprehensive test suite for hindsight validation |
| 39 | - Covers prediction registration, scorecard generation, metrics output |
| 40 | - Ready for integration with Farnsworth implementation |
| 41 | |
| 42 | ## Round 1 (2026-06-05) |
| 43 | |
| 44 | - Triaged issues #232, #230, #188 |
| 45 | - PR #235: quality-gate fallback hardening (Copilot → GitHub Models path) |
| 46 | - Decision: data-only fallback when all AI sources fail |
| 47 | - Reusable skill: notify-failure job for pipeline failure visibility |
| 48 | - Outcomes: #232 has PR ready, #230 closed as stale, #188 rerouted to Leela |
| 49 | |
| 50 | ## PR #236 QA (2026-06-05) |
| 51 | |
| 52 | - Config-driven RSS expansion should be verified at the stage boundary: crawler output shape, correlation input resolution, press-context fallback, and rebuild hydration all need coverage. |
| 53 | - Bounded in-process RSS fan-out is acceptable for the current five-source enrichment set when full tests and a live smoke confirm stable artifact production. |
| 54 | |
| 55 | ## Round 2 (2026-06-05) |
| 56 | |
| 57 | - QA review of PR #236 RSS enrichment feature complete |
| 58 | - 554 unit tests passed |
| 59 | - Live 5-source RSS smoke test: 54 articles, 5 sources, no feed errors |
| 60 | - QA verdict: **approve** (no follow-up QA work required) |
| 61 | - Formal approval blocked by GitHub own-PR rules (self-authored by Fry PR author) |
| 62 | - Posted QA rationale to PR #236 |
| 63 | - Awaiting security review (Hermes) and lead approval (Leela) before merge |
| 64 | |
| 65 | ## PR #235 Copilot review follow-up (2026-06-05) |
| 66 | |
| 67 | - Copilot fallback warnings should describe the observed pipeline state, not just retry exhaustion: the same branch can mean 0 Copilot attempts because the CLI is unavailable or failed attempts that never yielded a publishable summary. |
| 68 | |
| 69 | ## PR #235 Copilot review resolution (2026-06-05) |
| 70 | |
| 71 | - Resolved Copilot review thread PRRT_kwDOSgq4hM6HaPhr |
| 72 | - Updated fallback warning: "No publishable Copilot summary was produced; falling back to GitHub Models API." |
| 73 | - Added pipeline test assertion to prevent regression |
| 74 | - 9 tests passing |
| 75 | - commit 7409b05 pushed; thread resolved |
| 76 | |
| 77 | |
| 78 | ## Crawler reliability analysis (2026-06-05) |
| 79 | |
| 80 | - Multi-source RSS is not yet the crawl bottleneck; GitHub API crawl still dominates wall time, while five external RSS sources completed in about one second after dependency setup. |
| 81 | - Next reliability iteration should keep GitHub crawl/cache as one core job and matrix only optional external news sources, merging per-source artifacts before analysis for isolation, retry granularity, and reproducible handoff. |
| 82 | |
| 83 | ## Crawler reliability architecture assessment (2026-06-05T16:26:00Z) |
| 84 | |
| 85 | - Reviewed old (26753498571) vs. new (27026348186) crawl jobs; GitHub repo crawl is the actual bottleneck (~4m47s–5m58s). |
| 86 | - In-process model is operationally simple/fast but offers poor per-source failure isolation; retry requires full crawl rerun. |
| 87 | - Recommendation: hybrid staged topology — keep GitHub crawl monolithic; add matrix for external RSS with fail-fast: false, per-source artifacts, and deterministic merge before analysis. |
| 88 | - Acceptance criteria: shared crawl context (week, since, until, source config), per-source artifacts (success or error JSON), merge job on `if: always()`, explicit optional-source degradation, backward-compatible rebuild mode. |
| 89 | - Tests to add: merge helper validation (schema, dedupe, sorting, error handling), per-source failure handling, fallback paths, reproducibility gates, citation preservation. |
| 90 | - Metrics: per-source (name, host, duration, article counts, errors) and aggregate (source_count, failed_source_count, total articles, artifact size). |
| 91 | - Decision recorded in .squad/decisions.md. |
| 92 | |
| 93 | ## Issue #238 notify triage (2026-06-05) |
| 94 | |
| 95 | - Run 27026348186 completed crawl, analyze, generate, and deploy successfully; only `notify` failed. |
| 96 | - Root cause: `gh release create week-2026-W23` is not idempotent when the weekly release tag already exists, so rerunning/publishing the same week produced HTTP 422 `Release.tag_name already exists`. |
| 97 | - QA fix: make notify update an existing weekly release with `gh release edit` instead of failing, while preserving release creation for new weeks. |
| 98 | |
| 99 | ## Matrix + map/reduce PRD QA input (2026-06-05T18:15:23Z) |
| 100 | |
| 101 | - Matrix crawl should be gated by deterministic shared run context, per-leg artifacts, fan-in checksums, optional-vs-required failure policy, and explicit rate-limit budgets; GitHub search fan-out is riskier than RSS fan-out because search quota is already the tight limit. |
| 102 | - Map/reduce analysis is promising for context reduction only if mapper outputs are schema-validated, reducer output preserves citations and contradictions, and the final markdown still passes the existing analysis gate with current fallback paths retained. |
| 103 | |
| 104 | ## Analysis decomposition QA recommendation (2026-06-05T20:57:09Z) |
| 105 | |
| 106 | - Signal-type hierarchical map/reduce is the lowest-risk analysis decomposition MVP because it matches current raw payload boundaries, is fixture-testable, and can run sidecar-first without overwriting the existing Copilot -> GitHub Models -> no-AI publish path. |
| 107 | - Map/reduce must not become publishable until mapper/reducer schemas, citation bindings, rejected-claim/contradiction sidecars, final `analysis_gate.py` compliance, fallback preservation, and A/B quality metrics pass. |
| 108 | |
| 109 | ## Issue #257 overwrite-protection test groundwork (2026-06-05T21:16:49Z) |
| 110 | |
| 111 | - Added deterministic no-network regression coverage around publish eligibility manifests and promotion guard behavior. |
| 112 | - Good canonical weekly summary/content must remain unchanged when candidates are failed, degraded, no-AI, stale, missing-manifest, or malformed-manifest. |
| 113 | - Safe rerun promotion is copy-stable and must not append or duplicate article body content; ineligible candidates should remain in staging with promotion diagnostics for debugging. |
| 114 | |
| 115 | ## Issue #291: Copilot Pricing Validation (2026-06-06) |
| 116 | |
| 117 | - Validated centralized pricing implementation in `scripts/model_pricing.py` for correctness and consistency. |
| 118 | - Workflow safety review: `.github/workflows/copilot-pricing-review.yml` safe for production. |
| 119 | - Full test suite passed (554 tests); no breaking changes detected. |
| 120 | - Pricing validation will support future cost-aware pipeline decisions and analysis budget optimization. |
| 121 | ## Issue #287 — Analysis Gate Preflight Hardening (2026-06-06T21:23:50.664Z) |
| 122 | |
| 123 | - ✅ APPROVED: Bender's evidence inventory and gate failure classification implementation |
| 124 | - ✅ Validated: Evidence schema, citation link integrity, gate failure handling across all cases |
| 125 | - ✅ No regressions: pytest full pass (673 passed, 2 subtests) |
| 126 | - PR #288 validated and approved; ready for Coordinator merge workflow |
| 127 | - Orchestration log recorded at `.squad/orchestration-log/20260606T212350Z-fry.md` |
| 128 | |
| 129 | ## Podcaster handoff QA validation (2026-06-07T21:42:28.011+00:00) |
| 130 | |
| 131 | - Validated SquadScope-side Podcaster handoff locally without reading or printing `PODCASTER_API_KEY`; local shell did not expose Podcaster endpoint/key, while Actions has both `PODCASTER_ENDPOINT` variable and `PODCASTER_API_KEY` secret configured by presence check only. |
| 132 | - Commands: `TMPDIR=$PWD/.copilot/local-tmp python3 -m pytest tests/test_podcaster_handoff.py tests/test_pipeline.py -q` passed 20 tests; `TMPDIR=$PWD/.copilot/local-tmp python3 -m pytest -q` passed 702 tests plus 2 subtests. |
| 133 | - Mock dry-run exercised `scripts/podcaster_handoff.py --podcaster-dry-run` against a localhost HTTP server with a placeholder key: response accepted, auth header present, stdout did not disclose the key, and payload included `week`, `article_url`, `article_sha256`, `source_artifacts`, and `dry_run: true`. |
| 134 | - Workflow audit: `.github/workflows/crawl-and-publish.yml` only runs `podcaster-handoff` for non-`dry-run`/non-`candidate-only` runs, so `gh workflow run crawl-and-publish.yml -f run_mode=dry-run` is safe for the article pipeline but cannot validate the real Podcaster secret/endpoint handoff. |
| 135 | - QA blocker for first live Podcaster dry-run: the configured secret is Actions-only and there is no dedicated non-publishing Podcaster dry-run workflow/job. Do not dispatch a normal run solely to test Podcaster because it can publish or replace production content. |
| 136 | - Issue #302 acceptance gaps resolved in PR #314: the handoff job now declares `needs: [analyze, generate, deploy]` so it waits for `deploy`, passes publish run ID and publish mode in the payload, and runs with `continue-on-error: true` so a Podcaster failure cannot fail the weekly workflow. Remaining design note: it is still an in-workflow job rather than a separate post-success workflow. |