Skip to content

fix(ingest): Issue #288 — GOOG/GOOGL XBRL concept-name omission (market_cap 2.2× inflated)#292

Merged
dackclup merged 3 commits into
mainfrom
claude/fix-288-goog-googl-xbrl-concept
May 28, 2026
Merged

fix(ingest): Issue #288 — GOOG/GOOGL XBRL concept-name omission (market_cap 2.2× inflated)#292
dackclup merged 3 commits into
mainfrom
claude/fix-288-goog-googl-xbrl-concept

Conversation

@dackclup
Copy link
Copy Markdown
Owner

Summary

Closes #288multi_class_per_class_override_count = 0 on every production cron since PR #269 (5bf38c12) landed 2026-05-26. Both GOOG and GOOGL display inflated market_cap (~$4.66T / $4.71T) instead of the correct per-class values (~$2.09T / $2.59T).

Root cause (edgar-debugger verdict 2026-05-28)

compute/ingest/fundamentals.py:735 _fetch_shares_from_per_filing_xbrl filter mode queried only 2 XBRL concepts:

  • dei:EntityCommonStockSharesOutstanding
  • us-gaap:CommonStockSharesIssued

Alphabet's 10-K files per-class share counts under us-gaap:CommonStockSharesOutstanding — the missing 3rd concept. Primary path at lines 115-124 already queries all 3 concepts in this order; the XBRL fallback path drifted out of parity.

Existing tests at test_fundamentals.py:822-857 mock _fetch_shares_from_per_filing_xbrl entirely (return_value=per_class) — they confirm _build_snapshot Branch-3 trigger but never exercise the actual concept-lookup path. Bug survived the test suite.

Fix (9 files)

File Change
compute/ingest/fundamentals.py:735-749 Add us-gaap:CommonStockSharesOutstanding to concept tuple (matches primary path order); fix misleading docstring at lines 686-687
compute/ingest/fundamentals.py:48-71 _FALLBACK_STATS gains "per_class_attempt": 0; reset wired in reset_fallback_stats()
compute/ingest/fundamentals.py:~1030 Increment per_class_attempt AT TOP of Branch 3 elif (before XBRL call), so counter captures "branch entered" regardless of XBRL success
compute/config.py:30 Schema PATCH bump 0.10.7-phase4.6 → 0.10.8-phase4.6
compute/output/schemas.py:~340 New Metadata.multi_class_per_class_attempt_count: int | None = None field (Rule 18 disambiguator)
compute/main.py:~2023 Wire multi_class_per_class_attempt_count to Metadata construction
frontend/lib/types.ts:~233 Mirror TS field
frontend/lib/schema-snapshot.json Regenerated via --update-snapshot
tests/test_config.py Schema version pin 0.10.7 → 0.10.8; docstring → Issue #288
tests/test_ingest/test_issue288_xbrl_concept_tuple.py (NEW) 4 regression tests

Rule 18 disambiguation (the new counter)

State Meaning
attempt == override == 0 Branch 3 never triggered (allowlist empty OR QR_SKIP_FUNDAMENTALS set)
attempt > 0, override = 0 XBRL lookup returned None (regression class of #288)
attempt == override > 0 Normal operation; post-fix steady-state = both = 2 (GOOG + GOOGL)

Regression tests (would have FAILED on pre-fix)

Test What it pins
test_xbrl_fallback_filter_mode_returns_GOOG_class_C_shares Synthetic XBRL fixture: _fetch_shares_from_per_filing_xbrl(..., target_class_member="goog:CapitalClassCMember") returns 5,429,000,000
test_xbrl_fallback_filter_mode_returns_GOOGL_class_A_shares Same for GOOGL Class A → 5,822,000,000
test_xbrl_fallback_concept_tuple_includes_us_gaap_outstanding Explicit pin against re-omission: asserts "us-gaap:CommonStockSharesOutstanding" in queried_concepts
test_per_class_attempt_increments_on_branch_3_entry Counter wiring verification

Impact — display-only, NOT a scoring regression

Verification

  • ruff check . — PASS
  • python -m compute.output.schema_check — PASS (triple in sync at 0.10.8-phase4.6)
  • schema-sentinel verdict — TRIPLE-IN-SYNC
  • python -m pytest tests/test_ingest/test_issue288_xbrl_concept_tuple.py4 passed
  • python -m pytest tests/test_config.py tests/test_output/ -q -m "not network"70 passed

Deferred follow-ups (NOT in this PR)

Test plan

  • CI green (Python lint+test, Frontend build, Vercel preview)
  • schema-sentinel verdict on CI: TRIPLE-IN-SYNC
  • Next cron after merge: multi_class_per_class_attempt_count = 2 AND multi_class_per_class_override_count = 2 (currently 0)
  • Next cron after merge: /stock/GOOG market_cap ≈ $2.09T (was $4.66T); /stock/GOOGL ≈ $2.59T (was $4.71T)
  • multi_class_aggregate_shares_suspected annotate continues firing for both tickers as safety net

https://claude.ai/code/session_01AGU8d6pm4u2fQQ5cebg9qa


Generated by Claude Code

Closes #288. `multi_class_per_class_override_count = 0` on every
production cron since PR #269 landed 2026-05-26 — both GOOG and GOOGL
rendered inflated `market_cap` (~$4.66T / $4.71T) instead of correct
per-class values (~$2.09T / $2.59T).

Root cause (edgar-debugger verdict 2026-05-28):
`compute/ingest/fundamentals.py:735` `_fetch_shares_from_per_filing_xbrl`
filter mode queried only 2 XBRL concepts (`dei:EntityCommonStockSharesOutstanding`
+ `us-gaap:CommonStockSharesIssued`). Alphabet's 10-K files per-class
share counts under `us-gaap:CommonStockSharesOutstanding` — the missing
3rd concept. Primary path at lines 115-124 already queries all 3 in
this order; XBRL fallback path drifted out of parity.

Existing tests at `test_fundamentals.py:822-857` mock
`_fetch_shares_from_per_filing_xbrl` entirely (`return_value=per_class`)
— they confirm `_build_snapshot` Branch-3 trigger but never exercise
the actual concept-lookup path. Bug survived the test suite.

Fix (9 files):
- `compute/ingest/fundamentals.py:735-749` — add `us-gaap:CommonStockSharesOutstanding`
  to the concept tuple (between the 2 existing entries, matching primary
  path order); fix misleading docstring at lines 686-687
- `compute/ingest/fundamentals.py:48-71` — `_FALLBACK_STATS` dict gains
  `"per_class_attempt": 0`; reset wired in `reset_fallback_stats()`
- `compute/ingest/fundamentals.py:~1030` — increment `per_class_attempt`
  AT TOP of Branch 3 elif (before XBRL call), so the counter captures
  "branch entered" regardless of XBRL success
- `compute/config.py:30` — schema PATCH bump `0.10.7-phase4.6 → 0.10.8-phase4.6`
- `compute/output/schemas.py:~340` — new `Metadata.multi_class_per_class_attempt_count: int | None = None`
  field (Rule 18 disambiguator)
- `compute/main.py:~2023` — wire `multi_class_per_class_attempt_count`
  to Metadata construction
- `frontend/lib/types.ts:~233` — mirror TS field
- `frontend/lib/schema-snapshot.json` — regenerated via `--update-snapshot`
- `tests/test_config.py` — schema version pin `0.10.7 → 0.10.8`;
  docstring updated to reference Issue #288
- `tests/test_ingest/test_issue288_xbrl_concept_tuple.py` (NEW) — 4
  regression tests: GOOG class-C lookup, GOOGL class-A lookup, concept-
  tuple inclusion pin (`assert "us-gaap:CommonStockSharesOutstanding"
  in concept_list` — explicit guard against re-omission), and Branch-3
  attempt-counter wiring. Would have FAILED on pre-fix code.

Rule 18 disambiguation (the new counter):
- `attempt == override == 0` → Branch 3 never triggered
- `attempt > 0`, `override = 0` → XBRL lookup returned None (regression #288)
- `attempt == override > 0` → normal operation; post-fix steady-state = 2

Impact (display-only, NOT a scoring regression):
- Composite scores / rankings / Rule 16 / Top-5 rotation UNAFFECTED
  (`market_cap` not an 8-pillar input)
- `multi_class_aggregate_shares_suspected` annotate safety net continues
  firing (PR #264)
- `/stock/GOOG` + `/stock/GOOGL` UI renders correct per-class market_cap
  on next cron
- `pe_ratio_ttm` re-derives from corrected shares

Verification:
- `ruff check .` — PASS
- `python -m compute.output.schema_check` — PASS (triple in sync at 0.10.8-phase4.6)
- `schema-sentinel` verdict — TRIPLE-IN-SYNC
- `python -m pytest tests/test_ingest/test_issue288_xbrl_concept_tuple.py` — 4 passed
- `python -m pytest tests/test_config.py tests/test_output/ -q -m "not network"` — 70 passed

Deferred (NOT in this PR):
- @network GOOG/GOOGL drift-detector test (live SEC, EDGAR_USER_AGENT required)
- Issue #289 NVR DQIC fix (Option C per methodology-scientist) — separate PR
@vercel
Copy link
Copy Markdown

vercel Bot commented May 28, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
quantrank Ready Ready Preview, Comment May 28, 2026 3:39am

CI failure on PR #292 — 3 existing `_FALLBACK_STATS` pin-tests in
`test_fundamentals.py` (lines 419 / 450 / 712) hardcoded the dict to
exactly 5 keys. This PR's Issue #288 fix added a 6th key
(`per_class_attempt`) for the Rule 18 disambiguator. The pin-tests
correctly caught the schema change; just needed updates.

Changes:
- `test_reset_fallback_stats_zeros_counters` — set `per_class_attempt=5`
  in the non-zero preamble; expect `per_class_attempt: 0` post-reset
- `test_get_fallback_stats_returns_copy_not_reference` — expect 6-key
  shape after reset
- `test_get_fallback_stats_returns_five_keys_after_dimensional_path` →
  renamed to `_returns_six_keys_after_dimensional_path` + updated
  docstring to reference Issue #288's `per_class_attempt` addition;
  pin updated to 6-key shape (dimensional path doesn't touch
  per_class_attempt, so stays at 0)

Verification:
- `python -m pytest tests/test_ingest/test_fundamentals.py tests/test_ingest/test_issue288_xbrl_concept_tuple.py` — 32 passed
- All 3 previously-failing tests now pass post-fix
…I001)

PR #292 Python (lint + test) CI failed on commit c428fe6 due to ruff
F401 (unused imports) + I001 (import ordering) in the new regression
test file. Auto-fixable via `ruff check --fix`.

Leftover imports from draft iterations:
- `from types import SimpleNamespace` — never referenced (final version
  uses `unittest.mock.MagicMock` instead)
- `import pytest` — leftover from a draft that used @pytest.mark
  decorators; final version uses plain `assert` statements with no
  markers

Local `python -m pytest tests/test_ingest/` confirms 32 passed
post-fix; ci-triage-engineer 2026-05-28 verdict: ruff-F401-unused-import
+ compounding ruff-I001-import-ordering (HIGH confidence).
@github-actions
Copy link
Copy Markdown
Contributor

Pre-merge production simulation

Field Value
Duration 413s
Universe size 502
Schema version 0.10.8-phase4.6
Compute commit 9d50a93f1565e0c00550a565037d2b935614c441
PR-branch output pr-292-compute-output (14-day retention)

Diff vs main

Field Main PR Δ
Universe size 502 502 +0
Schema version 0.10.7-phase4.6 0.10.8-phase4.6 ⚠️ bumped

Main baseline: 2026-05-28T03:14:33Z (0.0 days old)

Top-10 movers (sorted by |Δcomposite_score|)

Ticker PR rank main rank Δrank PR score main score Δscore
HD 226 271 +45 51.74 50.18 +1.56
LVS 122 108 -14 56.77 57.70 -0.93
SNPS 493 495 +2 31.83 31.55 +0.28
DDOG 426 423 -3 40.51 40.75 -0.24
MCHP 492 491 -1 32.21 32.41 -0.20
NKE 443 438 -5 39.57 39.73 -0.16
ROST 222 218 -4 51.99 52.13 -0.14
LITE 496 497 +1 30.89 30.79 +0.10
PANW 432 431 -1 40.01 40.09 -0.08
CMG 294 296 +2 48.76 48.68 +0.08

@dackclup dackclup marked this pull request as ready for review May 28, 2026 04:22
@dackclup dackclup merged commit e9aaab3 into main May 28, 2026
5 checks passed
@dackclup dackclup deleted the claude/fix-288-goog-googl-xbrl-concept branch May 28, 2026 04:22
dackclup added a commit that referenced this pull request May 28, 2026
…+ bump pointers (#295)

End-of-day Track-A2 housekeeping. After 6 PRs landed on main today
(#286 / #290 / #291 / #292 / #293 / #294), the CLAUDE.md / PHASE_STATUS.md
/ SKILL.md pointers drifted again — schema bumped via PR #292
(0.10.7 → 0.10.8-phase4.6); USE_SECTOR_COE flipped via PR #294. This
PR closes the doc-drift loop so session N+1 reads correct state.

Changes (4 files, doc-only):

- CLAUDE.md §Phase status — schema `0.10.7-phase4.6 → 0.10.8-phase4.6`;
  defense layer narrative notes `USE_SECTOR_COE = True` post-#294;
  new "Post-tag production patches" subsection citing PRs #292 / #293
  / #294. "Recently merged" list prepended with 6 same-day entries;
  legacy "Earlier (PR #264 → PR #285)" subsection relabeled.

- PHASE_STATUS.md §Current state — schema mirror; new "Post-tag
  production patches" row; Production-run pointer `559c5269 →
  0ad1d57` (cron #69 chore-commit). "Recently merged" prepended.

- SKILL.md schema-version table — new top row for `0.10.8-phase4.6`
  (PR #292 GOOG/GOOGL XBRL fix + Rule 18 disambiguator).

- PHASE_STATUS_INFLIGHT.md — 6 stale `(in flight, 2026-05-28)`
  markers drained to `(merged 2026-05-28, <SHA>)` (PRs #286 / #290 /
  #291 / #292 / #293 / #294). Bodies preserved.

Doc-only PR — `ruff` / `schema_check` pass; no compute / schema /
scoring / valuation / frontend / Python / TS change. CLAUDE.md
substance touched (pointer block + Recently merged refresh).
AGENTS.md substance unchanged per the delegation-pattern (PR #291
already bumped this morning).

Co-authored-by: Claude <noreply@anthropic.com>
dackclup added a commit that referenced this pull request May 28, 2026
Closes the silent-failure gap surfaced by Issue #287 PR A's Rule 18
instrumentation on cron Run #71 (368dccd, 2026-05-28 08:44 UTC). The
PR #292 GOOG/GOOGL per-class XBRL share-override fix did not fire in
production despite the code being correct on the runner.

Root cause (edgar-debugger 2026-05-28 verdict):

  - PR #292 (e9aaab3, 04:22 UTC) landed the per-class XBRL override
    at compute/ingest/fundamentals.py:1043-1067 (Branch 3 of
    _build_snapshot).
  - Branch 3 only executes on live EDGAR fetch — fetch_fundamentals
    short-circuits at _is_fresh() (line 1292-1294) when cached parquet
    age by latest_filed_date < FUNDAMENTALS_REFETCH_DAYS = 45.
  - Earlier same-day cron 0ad1d57 (03:22 UTC, pre-PR-#292) wrote a
    stale aggregate parquet (GOOG shares_outstanding = 12.116B).
  - Cron Run #71 restored that parquet from the GitHub Actions cache;
    _is_fresh() returned True on latest_filed_date=2026-04-30 (28d
    < 45d), and Branch 3 never ran.
  - metadata.multi_class_per_class_attempt_count = 0 (PR #292 Rule 18
    disambiguator working as designed — the smoking gun).
  - fundamentals_latency_p50_seconds = 0.0 (warm-cache replay confirmed
    universe-wide).

Fix scope (6 files, YAML + paired test bump):

  - .github/workflows/compute-rankings.yml — 3 instances cache-v4- →
    cache-v5- (key + 2 restore-keys) + comment block expanded to cite
    Issue #288 follow-up + PR #292 + PR #269 + introduce a 2-trigger
    bump taxonomy (schema change OR value-correctness fix in live-
    fetch-only path).
  - .github/workflows/pre-merge-prod-sim.yml — mirror 3-string flip
    per the file's own "bump together if either changes" comment.
    Without this the simulate workflow would lose all 11 warm caches
    on every PR.
  - tests/test_workflow_cache_coverage.py — paired-test bump per the
    PR 4c.1 v3→v4 precedent. Function renamed
    test_workflow_cache_key_is_v4 → _v5; docstring rewritten to cite
    Issue #288 + PR #292 + the 3-trigger bump taxonomy.
  - CLAUDE.md §Phase status — drain stale "in flight" wording for
    PR #297 (now merged) + empirical-validation note for cron Run #71
    + "in flight this PR" entry for the cache-v5 bump.
  - AGENTS.md open-issues list — update #287 (PR A merged via #297),
    #288 (fix in flight this PR), #289 (closed by PR #293).
  - PHASE_STATUS_INFLIGHT.md — full in-flight entry appended per
    PR #237 side-file convention.

Why Option A (cache-key bump) over alternatives (per edgar-debugger):

  - Option B (targeted per-ticker invalidation): introduces cache-layer-
    knows-multi-class semantics + chicken-and-egg "detect stale
    aggregate from cached parquet" condition.
  - Option C (refactor override out of fetch path): cache hit triggers
    live SEC call (violates cache semantics) + FundamentalsSnapshot is
    frozen.
  - Option A: matches PR 4c.1 v3→v4 precedent exactly + zero compute/
    change + guaranteed correctness on next cron.

One-time cost: ~25-50 min cold cron on the immediately-following
weekly run (full S&P 500 universe live re-fetch). Subsequent crons
return to warm-cache ~5-10 min budget. No timeout-minutes impact —
PR #297 just bumped to 195m which absorbs cold-cache reality.

Verification on next cron Run #72:

  - metadata.multi_class_per_class_attempt_count = 2 (was 0)
  - metadata.multi_class_per_class_override_count = 2
  - stocks/GOOG.json shares_outstanding ≈ 5.429B (Class C, was 12.116B)
  - stocks/GOOGL.json shares_outstanding ≈ 5.822B (Class A, was 12.116B)
  - stocks/GOOG.json market_cap ≈ $2.09T (was $4.66T)
  - stocks/GOOGL.json market_cap ≈ $2.59T (was $4.71T)
  - metadata.fundamentals_latency_p50_seconds > 0.0 (live fetch active)

Adjacent findings deferred (NOT in this PR):

  - FOX / FOXA / NWS / NWSA: same multi_class_aggregate_shares_suspected
    annotate firing but they are on MULTI_CLASS_SHARE_ALLOWLIST
    (UNDERCOUNT path, PR #257). Decision on whether to add to overcount
    allowlist deferred to Q3 2026-08-19 quarterly cohort audit per
    methodology-scientist precedent (needs live XBRL probe).
  - OSAP wall-clock 347.1s on Run #71: cold OSAP download (cache > 31d
    mtime or evicted). Single observation; not a regression. Watch on
    next 2-3 crons.

Hard constraints honored:

  - No compute / scoring / schema / valuation / Rule 16 / Top-5
    invariant touched
  - No new defense flag · No new dep · No new env-var
  - YAML + paired-test diff (per quantrank-reviewer feedback on
    PR-title framing — original "YAML-only" was misleading)
  - Schema version UNCHANGED at 0.10.9-phase4.6 (no Pydantic / TS /
    snapshot change)

Pre-push 3-reviewer gate:

  - phase-coordinator Mode B (sonnet): LOCKSTEP-SATISFIED — both
    CLAUDE.md + AGENTS.md substance touched, INFLIGHT entry well-
    shaped, branch in-sync with origin/main (no rebase needed)
  - quantrank-reviewer (opus): FIX-AND-RE-REVIEW → 2 FAIL + 4 WARN.
    Both FAILs fixed in this commit (tests/test_workflow_cache_coverage.py
    test pin + pre-merge-prod-sim.yml cache-v4 stragglers). WARN 1
    (Issue #288 lifecycle) addressed via Reopens/Closes directives
    below. WARN 2 (AGENTS.md cron #69 cross-ref), WARN 3 (comment
    density) deferred — minor.

Reopens #288
Closes #288

https://claude.ai/code/session_01AGU8d6pm4u2fQQ5cebg9qa

Co-authored-by: Claude <noreply@anthropic.com>
dackclup added a commit that referenced this pull request May 28, 2026
…rkers + bump pointers (#299)

Closes today's 10-PR cycle (#286 / #290 / #291 / #292 / #293 / #294 /
#295 / #296 / #297 / #298). Mirror of PR #286 (post-v1.4.0 cycle
drain) for the post-cron-#71 cycle.

Three stale `(in flight, 2026-05-28)` markers in
PHASE_STATUS_INFLIGHT.md drained to `(merged 2026-05-28, <SHA>)`:

  - PR #295 (`2d2ec83e`) — Post-session housekeeping drain 6 INFLIGHT
    + bump pointers
  - PR #297 (`ecb60e64`) — Issue #287 PR A: durable timeout + cache
    canary + per-loop wall-clock Metadata (schema 0.10.8 → 0.10.9-phase4.6)
  - PR #298 (`030675e9`) — Issue #288 follow-up: cache-key bump v4 → v5

Bodies preserved (historical record).

CLAUDE.md §Phase status — drained the "(In flight this PR — cache-v5)"
qualifier (PR #298 merged) + added post-PR-#298 confirmation note +
cron Run #71 production-verified pointer.

AGENTS.md open-issues list — #288 status flipped "(fix in flight this
PR)" → "(closed by PR #298 cache-v5 bump)" + clarified the silent-
failure root-cause + Run #72 verification gate.

Why this PR exists: without end-of-day drain, session N+1 reading
CLAUDE.md / PHASE_STATUS_INFLIGHT.md would see 3 PRs still marked
"in flight" despite them merging hours earlier — the same friction
pattern PR #286 closed for the post-v1.4.0 cycle. Three same-day
drains in one PR keeps the side-file disciplined.

Scope (3 files, doc-only):

  - PHASE_STATUS_INFLIGHT.md — 3 header substitutions + this PR's
    own in-flight entry appended per PR #237 side-file convention
  - CLAUDE.md §Phase status pointer refresh
  - AGENTS.md open-issues list #288 status update

Hard constraints honored:

  - No code / scoring / schema / valuation / Rule 16 / Top-5
    invariant touched
  - No new defense flag · No new dep · No new env-var
  - Doc-only diff (Markdown only)
  - Schema version UNCHANGED at 0.10.9-phase4.6 (no Pydantic / TS /
    snapshot change)

PHASE_STATUS_INFLIGHT.md side-file satisfies §Conventions "ship with
every PR" lockstep per PR #237 convention. Same drain template as
PR #286 (post-v1.4.0 cycle).

https://claude.ai/code/session_01AGU8d6pm4u2fQQ5cebg9qa

Co-authored-by: Claude <noreply@anthropic.com>
dackclup added a commit that referenced this pull request May 28, 2026
…ULD-FIX cross-doc drifts (#301)

Comprehensive .md housekeeping closing today's 11-PR session day.
Output of docs-reviewer (sonnet) full Tier 1 + Tier 2 audit on main
(post-PR-#299) — verdict NEEDS-CROSS-REF-FIX with 14 prioritized
findings; this PR applies all 8 MUST-FIX + 6 SHOULD-FIX. 3 NICE-TO-FIX
deferred to follow-up.

Scope (7 files, doc-only):

  - SKILL.md schema-version history table (line 240) — prepend 2 new
    rows: 0.10.9-phase4.6 (PR #297, 4 *_wall_clock_seconds fields +
    195m timeout + cache canary, empirically validated cron Run #71)
    + 0.10.10-phase4.6 (PR #300 in flight — Issue #67 follow-up per-
    sector delta). Closes the canonical-history gap where PR #297 +
    PR #300 were absent.

  - PHASE_STATUS.md §Current state — schema row 0.10.8 → 0.10.9 +
    PR #300 in-flight note; Post-tag production patches row extended
    with PR #295/#296/#297/#298/#299 SHAs + one-liners; Production
    run pointer 0ad1d57 cron #69368dccd cron Run #71 with the
    PR #297 wall-clock empirical numbers + Issue #288 cache-replay
    smoking gun (multi_class_per_class_attempt_count=0 +
    fundamentals_latency_p50_seconds=0.0). Recently merged block
    extended 6 → 11 PRs. Issue closure status updated. Next
    deliverables refreshed: Issue #67 flip removed (PR #294 already
    executed); item 2 now = Issue #287 PR B FORM4 revert; PR #300
    per-sector delta added as item 3. Open issues list refreshed
    (#288 + #289 marked closed; #287 PR A vs PR B split).

  - CLAUDE.md §Phase status Recently merged block — extended 6 → 11
    PRs with full SHA + one-liner per PR. New "In flight" sub-section
    added for PR #300.

  - AGENTS.md §Phase + version state — Production-verified run
    cron #69 (233117a, 13m 16s) → cron Run #71 (368dccd, 14m 32s,
    2026-05-28 08:44 UTC, schema 0.10.7 → 0.10.9-phase4.6); 4 new
    wall-clock field values cited; Issue #288 cache-replay smoking
    gun captured; closed-issue note for #288 + #289 + #287 PR A.

  - CONTEXT.md §Live snapshot — schema 0.10.8 → 0.10.9 + PR #300
    in-flight note; new "Post-tag patches" row listing PRs #292-#299
    + PR #300 in flight; cron status cron #69 2026-05-27 → Run #71
    2026-05-28; Sector-CoE row updated with empirical 132 → 109;
    §Roadmap Stage 0 description refreshed.

  - WORKFLOW.md §Agentic 6-Phase Cadence session-start protocol —
    inline schema 0.10.7-phase4.6 replaced with current 0.10.9-phase4.6
    + pointer guidance to PHASE_STATUS.md §Current state as the
    canonical bump-per-schema-PR target. Closes the recurring inline-
    schema drift pattern.

  - PHASE_STATUS_INFLIGHT.md — this PR's in-flight entry appended per
    PR #237 side-file convention.

docs-reviewer lockstep cross-check after this PR:

  - SCHEMA_VERSION: ALIGNED across all 6 canonical docs at
    0.10.9-phase4.6 with PR #300 in-flight note where applicable
  - Defense layer 33 declared: ALIGNED (was already)
  - USE_SECTOR_COE = True post-PR #294: ALIGNED (was stale in
    AGENTS.md issue #67 framing + PHASE_STATUS.md Next deliverables;
    both fixed)
  - Subagent count 18: ALIGNED (was already)
  - Skill count 45: ALIGNED (was already)
  - Latest cron Run #71 368dccd: ALIGNED (was stale in AGENTS.md +
    PHASE_STATUS.md + CONTEXT.md; all fixed)
  - Issue #288 + #289 closure status: ALIGNED (was stale as open in
    AGENTS.md + PHASE_STATUS.md; both fixed)

3 NICE-TO-FIX deferred:

  - README.md Honest Limitations does not reference Phase 4.6 honest
    re-validation harness (PR #283). Coverage gap, not break.
  - WORKFLOW.md Phase 4.5 row cites v1.2.0; technically closed at
    v1.3.0-phase4.5e. Historical-context only.
  - METHODOLOGY.md USE_SECTOR_COE framing needs verification before
    edit.

Hard constraints honored:

  - No code / scoring / schema / valuation / Rule 16 / Top-5
    invariant touched
  - No new defense flag · No new dep · No new env-var
  - Markdown-only diff (no JSON / YAML / Python / TS change)
  - Schema version UNCHANGED on main at 0.10.9-phase4.6 (PR #300 will
    bump 0.10.10 on its merge)
  - AGENTS.md substance lockstep with CLAUDE.md per the established
    delegation pattern

Verification:

  - ruff check .                          PASS (no Python touched)
  - python -m compute.output.schema_check PASS (no schema touched)
  - pytest tests/ -m "not network"        N/A (no test surface)
  - Cross-reference grep — all 7 anchor strings consistent across
    all 6 docs after fix

https://claude.ai/code/session_01AGU8d6pm4u2fQQ5cebg9qa

Co-authored-by: Claude <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants