From 0949a3c1f2d2bcf2451fecf6859f107daa4a4bde Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 28 May 2026 05:43:12 +0000 Subject: [PATCH] =?UTF-8?q?chore(docs):=20post-session-housekeeping=202026?= =?UTF-8?q?-05-28=20=E2=80=94=20drain=206=20INFLIGHT=20+=20bump=20pointers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 → 0ad1d574` (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, )` (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). --- CLAUDE.md | 31 ++++++++++++++++++++------- PHASE_STATUS.md | 20 +++++++++++++----- PHASE_STATUS_INFLIGHT.md | 45 ++++++++++++++++++++++++++++++++++------ SKILL.md | 1 + 4 files changed, 78 insertions(+), 19 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index b2273cf9f..94ddccd67 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -493,23 +493,38 @@ whitespace / single-line fixes do not trigger. ## Phase status -Current schema **`0.10.7-phase4.6`** · defense layer **33 declared -boolean flags** (7 active vetoes + 26 annotates + reserved slots; 27 -currently emit until next cron exercises PRs #264 + #265 + Form-4 -cluster revert). Plus 5 numerical guards + `manipulation_index` -rollup. Latest release tag [**`v1.4.0-phase4.6`**](https://github.com/dackclup/quantrank/releases/tag/v1.4.0-phase4.6) +Current schema **`0.10.8-phase4.6`** · defense layer **33 declared +boolean flags** (7 active vetoes + 26 annotates + reserved slots; ~27 +currently emit; `USE_SECTOR_COE = True` post-PR #294 flip). Plus 5 +numerical guards + `manipulation_index` rollup. Latest release tag +[**`v1.4.0-phase4.6`**](https://github.com/dackclup/quantrank/releases/tag/v1.4.0-phase4.6) (2026-05-27, `bbca9cac`) — Phase 4.6 honest re-validation harness (universe survivorship-bias fix per Hou-Xue-Zhang 2020 + rankings.json time-series loader + forward-return loader + per-pillar Spearman IC + manipulation-index distribution shift + honest-baseline CLI with -McLean-Pontiff 2016 32% post-publication decay banner). Prior tag -[**`v1.3.0-phase4.5e`**](https://github.com/dackclup/quantrank/releases/tag/v1.3.0-phase4.5e) +McLean-Pontiff 2016 32% post-publication decay banner). Post-tag +production patches: PR #292 schema PATCH `0.10.7 → 0.10.8-phase4.6` +(Rule 18 disambiguator `multi_class_per_class_attempt_count` for +the GOOG/GOOGL XBRL concept-name omission fix); PR #293 Site-2 DQIC +ceiling retirement (NVR FP, methodology-scientist Option C); PR #294 +sector-CoE flip (Issue #67 `USE_SECTOR_COE = True`, Damodaran 2019 +Ch. 8.4 11-sector Ke, `value_trap_risk` 132 → 109 cohort drop). +Prior tag [**`v1.3.0-phase4.5e`**](https://github.com/dackclup/quantrank/releases/tag/v1.3.0-phase4.5e) (2026-05-26, `5db3b978`) — Phase 4.5e Form-4 insider-clustering ladder closure + LedgerCraft frontend reskin (defense layer 32 → 33; PR #264 `multi_class_aggregate_shares_suspected` + PR #265 DQIC site-2 rename `valuation_output_anomalous`). -**Recently merged** (PR #264 → PR #285, 2026-05-26 → 2026-05-27): +**Recently merged** (PR #286 → PR #294, 2026-05-28 — 6 PRs same day post-v1.4.0): +- PR #294 `0ddb6b81` — feat(valuation): Issue #67 — flip `USE_SECTOR_COE = True` (Damodaran 11-sector Ke) +- PR #293 `95e638bf` — fix(valuation): Issue #289 — retire Site-2 DQIC ceiling (NVR FP, methodology Option C) +- PR #292 `e9aaab31` — fix(ingest): Issue #288 — GOOG/GOOGL XBRL concept-name omission (schema `0.10.7 → 0.10.8-phase4.6`) +- PR #291 `cb9114bb` — docs(agents): AGENTS.md substance refresh (cron #51 → #69 pointer; 11 open-issues list) +- PR #290 `dea8e3ad` — chore(cleanup): post-cron-#69 — BK orphan removal + 3 doc drifts +- PR #286 `27361047` — chore(docs): housekeeping PR-B — drain INFLIGHT + bump pointers post-v1.4.0 +- (3 issues filed: #287 / #288 / #289; 4 comments posted on #41 / #115 / #130 / #137) + +**Earlier** (PR #264 → PR #285, 2026-05-26 → 2026-05-27): - PR #285 `8f373758` — docs(release): codify mobile-only operator convention for tag releases - PR #284 `a820caee` — fix(test): manipulation_distribution smoke resilient to shallow clones (CI `actions/checkout@v6` fetch-depth=1) - PR #283 `bbca9cac` — chore(release): **v1.4.0-phase4.6** — Honest re-validation harness diff --git a/PHASE_STATUS.md b/PHASE_STATUS.md index 519e5908a..da3f3d32d 100644 --- a/PHASE_STATUS.md +++ b/PHASE_STATUS.md @@ -17,17 +17,27 @@ | Field | Value | |---|---| -| Schema | **`0.10.7-phase4.6`** (PR #283 release tag bumped through PRs #269 GOOG/GOOGL per-class XBRL fix `0.10.5 → 0.10.6` + Phase 4.6 Metadata additions `0.10.6 → 0.10.7-phase4.6`) | -| Defense layer | **33 declared boolean flags** (7 active vetoes + 26 annotates + reserved slots; 27 currently emit in production until next cron exercises PR #264 + #265 + Form-4 cluster revert) · plus 5 numerical guards + `manipulation_index` rollup | +| Schema | **`0.10.8-phase4.6`** (PR #292 PATCH bump 2026-05-28 — Rule 18 disambiguator `Metadata.multi_class_per_class_attempt_count` for the GOOG/GOOGL XBRL concept-name omission fix; supersedes `0.10.7-phase4.6` PR #283 release) | +| Defense layer | **33 declared boolean flags** (7 active vetoes + 26 annotates + reserved slots; ~27 currently emit; `USE_SECTOR_COE = True` post-PR #294 flip) · plus 5 numerical guards + `manipulation_index` rollup | | Active vetoes | **7** — `altman_distress` · `sloan_accruals_top_decile` · `net_issuance_top_decile` · `non_reliance_filing` · `beneish_manipulation_veto` · `dechow_manipulation_veto` · `data_quality_input_corruption` | -| Latest release tag | [**`v1.4.0-phase4.6`**](https://github.com/dackclup/quantrank/releases/tag/v1.4.0-phase4.6) — 2026-05-27 at `bbca9cac` (Phase 4.6 honest re-validation harness — survivorship-bias fix per Hou-Xue-Zhang 2020 + rankings.json time-series loader + forward-return loader + per-pillar Spearman IC + manipulation-index distribution shift + honest-baseline CLI; release notes in `docs/release-notes/v1.4.0-phase4.6.md`) | +| Latest release tag | [**`v1.4.0-phase4.6`**](https://github.com/dackclup/quantrank/releases/tag/v1.4.0-phase4.6) — 2026-05-27 at `bbca9cac` (Phase 4.6 honest re-validation harness) | +| Post-tag production patches | PR #292 (`e9aaab31`, schema `0.10.7 → 0.10.8-phase4.6`, GOOG/GOOGL XBRL fix) · PR #293 (`95e638bf`, Site-2 DQIC retirement, NVR FP) · PR #294 (`0ddb6b81`, sector-CoE flip `USE_SECTOR_COE = True`, Issue #67 closure) | | Prior release tag | [**`v1.3.0-phase4.5e`**](https://github.com/dackclup/quantrank/releases/tag/v1.3.0-phase4.5e) — 2026-05-26 at `5db3b978` (Phase 4.5e Form-4 cluster + LedgerCraft reskin; defense layer headline 32 → 33) | -| Production run | `559c5269` (2026-05-27 cron, post-PR #285 main HEAD) | +| Production run | `0ad1d574` (2026-05-28 cron #69, post-PR #290 main HEAD; sector-CoE flip + #292 + #293 land in cron #70 Mon-Fri 22:00 UTC) | | Universe | 502 stocks (S&P 500 minus 1 delisting) | | Skill inventory | **45** invocation-triggerable + phase planning docs | | Subagent inventory | **18** project-specific in 4 tiers: **Tier 1 Core** (`quantrank-reviewer` · `schema-sentinel` · `defense-layer-auditor` · `edgar-debugger` · `stock-detail-auditor`) · **Tier 2 Lifecycle** (`security-reviewer` · `frontend-design-reviewer` · `vercel-preview-auditor` · `release-captain` · `phase-coordinator`) · **Tier 3 Specialized** (`test-engineer` · `methodology-scientist` · `literature-searcher` · `performance-engineer` · `dependency-auditor`) · **Tier 4 Operations** (`docs-reviewer` · `ci-triage-engineer` · `incident-commander`) | -**Recently merged** (PR #264 → PR #285, 2026-05-26 → 2026-05-27): +**Recently merged** (PR #286 → PR #294, 2026-05-28; 6 PRs landed same day post-v1.4.0 release): +- PR #294 `0ddb6b81` — feat(valuation): Issue #67 — flip `USE_SECTOR_COE = True` (Damodaran 2019 Ch. 8.4 11-sector Ke; methodology-scientist Mode B APPROVED; `value_trap_risk` 132 → 109 cohort drop, within target [80, 110] band) +- PR #293 `95e638bf` — fix(valuation): Issue #289 — retire Site-2 DQIC ceiling (NVR FP; methodology-scientist Option C; Site-1 + Defense #4 `extreme_*_estimate` + Issue #177 Huber-breakdown layer cover the remaining corruption + breakdown cases) +- PR #292 `e9aaab31` — fix(ingest): Issue #288 — GOOG/GOOGL XBRL concept-name omission (`market_cap` 2.2× inflated since PR #269; schema `0.10.7 → 0.10.8-phase4.6` for Rule 18 disambiguator) +- PR #291 `cb9114bb` — docs(agents): AGENTS.md substance refresh (production-verified run pointer cron #51 → cron #69; open-issues list 4 → 11 entries) +- PR #290 `dea8e3ad` — chore(cleanup): post-cron-#69 — BK orphan removal + 3 doc drifts (security-reviewer W1+W2 + edgartools 2.30 → 5.31) +- PR #286 `27361047` — chore(docs): housekeeping PR-B — drain INFLIGHT + bump pointers post-v1.4.0 +- (3 issues filed: #287 FORM4 revert + durable 5-loop timeout · #288 GOOG/GOOGL XBRL · #289 NVR DQIC; 4 comments posted on #41/#115/#130/#137) + +**Earlier** (PR #264 → PR #285, 2026-05-26 → 2026-05-27): - PR #285 `8f373758` — docs(release): codify mobile-only operator convention for tag releases (CLAUDE.md §Gotchas + release-tag SKILL.md + release-captain agent) - PR #284 `a820caee` — fix(test): `test_compute_shift_live_repo_recent_window` resilient to shallow clones (CI `actions/checkout@v6` fetch-depth=1 default) - PR #283 `bbca9cac` — chore(release): **v1.4.0-phase4.6** — Honest re-validation harness (`pyproject.toml` 1.3.0 → 1.4.0 + release notes) diff --git a/PHASE_STATUS_INFLIGHT.md b/PHASE_STATUS_INFLIGHT.md index b01eadfc0..1eeb2ce33 100644 --- a/PHASE_STATUS_INFLIGHT.md +++ b/PHASE_STATUS_INFLIGHT.md @@ -2145,7 +2145,7 @@ PHASE_STATUS_INFLIGHT.md side-file satisfies §Conventions "ship with every PR" --- -## PR (this PR) — Housekeeping PR-B: drain merged INFLIGHT entries + bump pointers post-v1.4.0 release (in flight, 2026-05-28) +## PR #286 — Housekeeping PR-B: drain merged INFLIGHT entries + bump pointers post-v1.4.0 release (merged 2026-05-28, `27361047`) Phase B (post-v1.4.0-tag housekeeping) PR. Cuts no code; pure doc-pointer + INFLIGHT.md maintenance — addresses the doc drift that accumulated across PRs #264-#285 (13 PRs landed since the last housekeeping in PR #267). @@ -2172,7 +2172,7 @@ CLAUDE.md substance touched (pointer block + Recently merged list refresh — bo --- -## PR (this PR) — Cleanup post cron #69: BK orphan removal + 3 doc drifts (in flight, 2026-05-28) +## PR #290 — Cleanup post cron #69: BK orphan removal + 3 doc drifts (merged 2026-05-28, `dea8e3ad`) Post-cron-#69 cleanup bundle. Cron run #69 (workflow_dispatch by user 2026-05-28 ~01:00 UTC, landed `233117ac chore: update rankings 2026-05-28` at `27361047` PR #286 merge SHA) surfaced 3 findings via `defense-layer-auditor` Section A-J + `stock-detail-auditor` deterministic prefilter + LLM verdict pass. 2 findings filed as issues (deferred to scoped follow-up sessions); 1 + 3 doc drifts batched into this PR. @@ -2209,7 +2209,7 @@ PHASE_STATUS_INFLIGHT.md side-file satisfies §Conventions "ship with every PR" --- -## PR (this PR) — AGENTS.md substance refresh: production-verified run pointer + open-issues list (in flight, 2026-05-28) +## PR #291 — AGENTS.md substance refresh: production-verified run pointer + open-issues list (merged 2026-05-28, `cb9114bb`) Second cleanup PR same day. PR #286 (housekeeping) opted to defer the AGENTS.md substance update under the `pointer-to-CLAUDE.md` delegation pattern; PR #290 (post-cron cleanup) noted the deferred AGENTS.md items but kept scope tight. This PR closes both deferred items. @@ -2253,7 +2253,7 @@ PHASE_STATUS_INFLIGHT.md side-file satisfies §Conventions "ship with every PR" --- -## PR (this PR) — Issue #288 fix: GOOG/GOOGL XBRL concept-name omission (in flight, 2026-05-28) +## PR #292 — Issue #288 fix: GOOG/GOOGL XBRL concept-name omission (merged 2026-05-28, `e9aaab31`) Closes Issue #288 — `multi_class_per_class_override_count = 0` on every production cron since PR #269 landed (2026-05-26). Both GOOG and GOOGL render inflated `market_cap` (~$4.66T / $4.71T) instead of correct per-class values (~$2.09T / $2.59T). @@ -2299,7 +2299,7 @@ PHASE_STATUS_INFLIGHT.md side-file satisfies §Conventions "ship with every PR" --- -## PR (this PR) — Issue #289 fix: retire Site-2 DQIC ceiling per Option C (in flight, 2026-05-28) +## PR #293 — Issue #289 fix: retire Site-2 DQIC ceiling per Option C (merged 2026-05-28, `95e638bf`) Closes Issue #289 — NVR `/stock/NVR` rendered empty fair-price section despite legitimate inputs ($458 EPS / $6,098 price / ~2.7M shares / `risk_flags: []`). Site-2 output-level ceiling (`FAIR_PRICE_DATA_QUALITY_CEILING = $10,000` in `compute/config.py`) tripped on `multiples_pe ≈ 22× × $458.86 ≈ $10,094` and nulled all 6 valuation methods. @@ -2355,7 +2355,7 @@ PHASE_STATUS_INFLIGHT.md side-file satisfies §Conventions "ship with every PR" --- -## PR (this PR) — Issue #67 sector-CoE flip: `USE_SECTOR_COE = True` (in flight, 2026-05-28) +## PR #294 — Issue #67 sector-CoE flip: `USE_SECTOR_COE = True` (merged 2026-05-28, `0ddb6b81`) Closes Issue #67 — flips `USE_SECTOR_COE` from `False` → `True` per methodology-scientist Mode B verdict 2026-05-28 + cron #69 empirical confirmation. Consumes the data-collection module landed in PR #204 (2026-05-22, Damodaran 2019 Ch. 8.4 + NYU January 2025 betas — LITERATURE-ANCHORED across all 11 GICS sectors). @@ -2405,3 +2405,36 @@ Closes Issue #67 — flips `USE_SECTOR_COE` from `False` → `True` per methodol PHASE_STATUS_INFLIGHT.md side-file satisfies §Conventions "ship with every PR" lockstep per PR #237 convention. CLAUDE.md + AGENTS.md substance untouched this PR — the methodology flip IS substantive but Q3 cohort audit (issue #130) is the canonical narrative venue, where the pre-prep checklist comment already documents the gating decision. --- + +## PR (this PR) — Post-session housekeeping 2026-05-28: drain 6 INFLIGHT markers + bump pointers (in flight, 2026-05-28) + +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. + +**Scope (4 files, doc-only)**: + +- **`CLAUDE.md`** §Phase status pointer block — schema `0.10.7-phase4.6 → 0.10.8-phase4.6`; defense layer narrative refreshed to note `USE_SECTOR_COE = True` post-#294; "Post-tag production patches" subsection added between Latest tag + Prior tag, citing PRs #292 / #293 / #294 + their SHAs + the substantive change each closes. "Recently merged" list prepended with 6 same-day entries; legacy "Earlier (PR #264 → PR #285)" subsection relabeled. + +- **`PHASE_STATUS.md`** §Current state — schema pointer mirrored (`0.10.7 → 0.10.8-phase4.6`); new "Post-tag production patches" row added (parallel structure to CLAUDE.md); Production-run pointer updated `559c5269 → 0ad1d574` (cron #69 chore-commit on 2026-05-28). "Recently merged" list prepended; legacy list relabeled "Earlier". + +- **`SKILL.md`** schema-version history table — new top row added for `0.10.8-phase4.6` (PR #292, GOOG/GOOGL XBRL fix + Rule 18 `multi_class_per_class_attempt_count` disambiguator); existing `0.10.7-phase4.6` row preserved as second entry. + +- **`PHASE_STATUS_INFLIGHT.md`** — 6 stale `(in flight, 2026-05-28)` markers updated to `(merged 2026-05-28, )` (PRs #286 / #290 / #291 / #292 / #293 / #294). Bodies preserved (historical record). + +**Why this PR exists**: + +Without this housekeeping, the next session reading CLAUDE.md §Phase status would see schema `0.10.7` despite code shipping `0.10.8`, and "Recently merged" would list PRs #264-#285 as the latest (missing 6 PRs from today). The pattern surfaced 2026-05-28 morning (Track A PR #286 closed analogous drift across PRs #264-#285); applying the same housekeeping at end-of-day for PRs #286-#294 prevents the same friction tomorrow. + +**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) +- Markdown-only diff + +**Hard constraints honored**: +- No code / scoring / schema / Rule 16 / Top-5 invariant touched +- No new defense flag · No new dep +- AGENTS.md substance untouched per the existing delegation pattern (CLAUDE.md = SoT for §Phase status / Stack); PR #291 already bumped AGENTS.md production-verified run pointer this morning + +PHASE_STATUS_INFLIGHT.md side-file satisfies §Conventions "ship with every PR" lockstep per PR #237 convention. CLAUDE.md substance touched (pointer block + Recently merged list refresh — both materially substantive). + +--- diff --git a/SKILL.md b/SKILL.md index 50a9da9f0..161ea48c4 100644 --- a/SKILL.md +++ b/SKILL.md @@ -237,6 +237,7 @@ Schema versions: | `0.7.0-phase4g` | Phase 4g | **8-K Tier-2 event defenses re-enabled** (PR #79, merged 2026-05-15 on `c35c6d40`, closes [issue #14](https://github.com/dackclup/quantrank/issues/14)). Flipped `compute/scoring/tier2._EIGHT_K_DEFENSES_ENABLED = True` after the PR 3d workflow-timeout deferral (root cause cleared by PR #58 cache layers + PR 3d tenacity tightening). `non_reliance_filing` (Item 4.02 hard veto, 365d lookback, Schroeder 2024 SSRN — ~50% of 4.02 filings precede formal restatement) returns to the active layer as the **5th active veto**. `auditor_change` (Item 4.01 annotate, 730d lookback, Reg S-K Item 304, Cohen-Malloy-Nguyen 2020 type) joins the Tier-2 annotate surface. No data-schema-shape delta — only the feature-flag flip + reason-taxonomy expansion. | | `0.7.1-phase4g` | Phase 4g | **`price_change_1d_pct` additive field** (squash-merged via PR #80, commit `1509f707`). New optional `float \| None` field on `StockSummary` + `StockDetail` — day-over-day percent change from the prior trading-day close. Computed once in `compute/main.py:_fetch_prices_one` from the last two valid yfinance closes; null for newly-IPO'd tickers (only one close available). Lets the ranking-table mobile cards render a change pill without lazy-fetching 502 per-stock history JSONs. Per `phase-4/schema-versioning/PLAN.md`: "Add a new optional field (default = None) → patch". Production metadata.version stays `0.7.0-phase4g` until next weekly compute. | | `0.7.1-phase4g` (no schema delta) | Phase 4.5a-4.5d wave | **Earnings-manipulation defense cluster — sub-PRs 4.5a + 4.5b + 4.5c + 4.5d shipped 2026-05-16/17** (PRs #89/#90/#91 + #93 + #95 + #97). **No data-schema-shape delta** — all 9 new flag identifiers are strings appended to existing `risk_flags: list[str]` (active vetoes) + `valuation_warnings: list[str]` (annotates) arrays. Active vetoes **5 → 7**: + `beneish_manipulation_veto` (Beneish 1999, M > −1.78) + `dechow_manipulation_veto` (Dechow 2011, F > 3.0). Annotates added: `manipulation_triple_flag` (4.5a joint gate, 2 fired: SMCI · WAT), `restatement_history` (4.5b, 59 fired / 11.8% — Hennes-Leone-Miller 2008 *TAR*), `late_filing_notification` (4.5b, 2 fired: HAS · Q — Bartov-Lai-Yeung 2002 *JAR*), `rem_suspect` (4.5c, 16 fired / 3.2% — Roychowdhury 2006 *JAE* 3-proxy REM via per-sector OLS), `accruals_momentum_high` (4.5d, 50 fired / 10.0% — Sloan 1996 / Beneish 1999 Δ(TATA) > +0.05 over 3y), `loss_avoidance_pattern` (4.5d, 0 fired — Burgstahler-Dichev 1997 cohort thresholds too tight for S&P 500 large-cap universe, file as follow-up). Also closes [issue #7](https://github.com/dackclup/quantrank/issues/7) (Sloan over-firing on Financials: 21.3% → 11.7%, sector spread 7.7× → 1.4×). 2 new cache dirs (`compute/cache/edgar_amendments/` + `compute/cache/edgar_late_filings/`, 7d TTL each). Test suite **646 → 831 offline**. Reason taxonomy: 24 stable + 2 Tier-3 + 2 new vetoes + 6 new annotates = **34 stable identifiers**. | +| **`0.10.8-phase4.6`** (PR #292 merged 2026-05-28 `e9aaab31`) | Issue #288 — GOOG/GOOGL XBRL concept-name omission fix | **PATCH bump** for new Rule 18 disambiguator `Metadata.multi_class_per_class_attempt_count`. PR #269 (`5bf38c12`) per-class XBRL override never fired in production since landing — `_fetch_shares_from_per_filing_xbrl` queried only 2 of the 3 needed XBRL concepts (`us-gaap:CommonStockSharesOutstanding` was the missing one; Alphabet files per-class share counts under this concept). Fix adds the missing concept to the tuple; counter disambiguates "branch never reached" (attempt=0) vs "XBRL returned None" (attempt>0, override=0). GOOG/GOOGL display `market_cap` corrected from ~$4.66T/$4.71T to ~$2.09T/~$2.59T per class; composite/rankings UNAFFECTED. Annotate-only safety net (`multi_class_aggregate_shares_suspected`) continues to fire. 4 new regression tests authored by `test-engineer`. | | **`0.10.7-phase4.6` @ tag `v1.4.0-phase4.6`** (PR #283 release 2026-05-27 `bbca9cac`) | Phase 4.6 honest re-validation harness | **MINOR bump** for Phase 4.6 additive `Metadata` fields landing across PRs #274-#282 (universe-provenance + survivorship-bias historical S&P 500 membership per Hou-Xue-Zhang 2020 RFS + ranking history time-series loader via git-archive + forward-return loader from gitignored price cache + per-pillar Spearman IC orchestrator via rank-then-Pearson, no scipy dep + manipulation-index distribution shift report). `scripts/generate_honest_baseline.py` CLI added with McLean-Pontiff 2016 32%-decay banner pinned in 5-phrase mandatory disclaimer. ZERO scoring / Top-5 / composite delta — all additive observability + offline-validation modules. | | **`0.10.6-phase4.5e`** (PR #269 merged 2026-05-26 `5bf38c12`) | Issue #261 PR-B — per-class XBRL extraction | **Structural fix for GOOG/GOOGL `$4.6T` overcount.** New `config.MULTI_CLASS_OVERCOUNT_ALLOWLIST: dict[str,str]` mapping ticker → exact XBRL class-member string (`GOOGL → "us-gaap:CommonClassAMember"`, `GOOG → "goog:CapitalClassCMember"` ← **filer-specific namespace gotcha** per edgar-debugger probe). `_fetch_shares_from_per_filing_xbrl` extended with `target_class_member` parameter; new elif branch in `_build_snapshot` fires when ticker is on allowlist + primary is plausible aggregate-shape. 2 new `Metadata` fields: `multi_class_per_class_override_count` (expected ~2 = GOOG + GOOGL) + `multi_class_mc_reconcile_failure_count` (Rule-18 defensive). PATCH — additive. ZERO behavior change for 500 non-allowlist tickers. | | **`0.10.5-phase4.5e`** (PR #264 merged 2026-05-26 `d9c62292`) | Issue #261 PR-A — multi-class CIK-collision annotate | **New `multi_class_aggregate_shares_suspected` annotate** + Rule 18 `Metadata.multi_class_aggregate_shares_suspected_count: int \| None`. Fires when two or more tickers share the same CIK AND each ticker's market_cap > 10% of universe-median (`MARKET_CAP_FLOOR_RATIO = 0.10`). Annotate-only; composite rank unchanged. Defense layer 32 → 33 declared. Expected steady-state firing ≈ 6 (GOOG / GOOGL / NWS / NWSA / FOX / FOXA). PATCH — additive `Metadata` field only. Companion PR #265 renamed Site-2 DQIC emission to `valuation_output_anomalous` without schema delta. |