AD-030: retire the gets-sharper-every-day promise + last behavioral scoring path - #419
Closed
runyourempire wants to merge 2 commits into
Closed
AD-030: retire the gets-sharper-every-day promise + last behavioral scoring path#419runyourempire wants to merge 2 commits into
runyourempire wants to merge 2 commits into
Conversation
…stack The last behavioral scoring path left after the v19 demotion (AD-029), found by the post-merge verification sweep: build_negative_stack injected 0.30 Bayesian suppression priors from auto-detected anti_topics rows whose confidence is pure dismissal count (rejection_count/10) — five dismissals could auto-ban a topic to x0.30 composite authority via negative_stack_prior. Inert on the live corpus (anti_topics has 0 rows, priors byte-identical, hence NO PIPELINE_VERSION bump — precedent and probe documented in scoring/mod.rs), but structurally live. The negative stack now builds from competing-tech inference over the actual dependency graph only. Explicit topic suppression remains user-authored exclusions, which hard-filter upstream. blind_spots' duplicate anti-topic feed removed with it. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016puYGGmj3oHxmcKBbJ5vXq
The promise described a mechanism AD-029 removed, was never measurable
("all risk, no demonstrated lift" — 7 explicit feedback signals against a
200k-item corpus), and post-v19 left ~100 instances of self-contradicting
copy, several asserting dead mechanisms inside Score Autopsy — live
INV-023 violations. Pre-launch (public, unadvertised) is the only cheap
moment; after launch this is a retraction.
New canonical (propagated from CLAUDE.md through every surface):
"4DA reads the internet for developers — privately, locally. Your
codebase decides what''s relevant." "Yesterday''s noise becomes tomorrow''s
signal" SURVIVES, re-attributed to corpus re-judging (verdict epochs +
re-examination) — it is true and implemented. The 92%/98% benchmark stays
as body copy with methodology. "Compound knowledge" survives only in the
framework''s dev-process sense.
- Governance first: AD-030 (with re-claim criteria: a /calibrate-measured
lift, published) + amendments to AD-017/025/026/028 — all four decisions
survive, only rationales rewrite (AD-028''s lifetime honesty now rests on
the cost structure: zero marginal cost + offline 2099 key)
- P0: in-app strings that asserted dead mechanisms rewritten or deleted
("will be penalized in relevance scoring", "Boosted because you''ve shown
interest", "scoring corrections applied", the "Learned" badge, learned
factor rows + affinity chips — the anti factor also had inverted
magnitude/multiplier semantics and rendered a false penalty on every item)
- "Compound Intelligence" tab renamed "Personal, Not Aggregate" — its
content (per-user, inspectable, local-only) was always a privacy story
- 13 locales: 45 stale keys purged per locale, regenerated from corrected
English via i18n:fill; generator scripts purged first so nothing
re-injects (apply-translations.cjs carried 12 hardcoded copies)
- Ship-locked surfaces: installer shortDescription/longDescription,
homepage JSON-LD (incl. the Offer), npm MCP README (lands on next
publish)
- Site + docs: 22 files rewritten under the house rule (present-tense
verifiable statements; improvement attributed to engine updates and the
user''s codebase, never engagement); signal.njk''s 16 compounding claims
reframed on the analysis layer; the refund-adjacent trial claim deleted;
framework §7 kept as a dev-process thesis with scoring-accuracy claims
stripped across all three mirrored copies
- New public post: site/src/writing/retiring-a-claim-we-could-not-measure
— the incident record as an engineering story, ending on the re-claim bar
- Enforcement: scripts/check-retired-claims.cjs (+9 tests) wired into
test:scripts and validate; historical-record files allowlisted;
retired-ok escape hatch for quoting the claim as history
Verified: guard clean repo-wide; translation parity 0 errors across 13
languages; tsc clean; frontend suite green; Rust 4,419 green; fmt clean.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016puYGGmj3oHxmcKBbJ5vXq
runyourempire
enabled auto-merge (squash)
August 11, 2026 18:12
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
This was referenced Aug 13, 2026
runyourempire
added a commit
that referenced
this pull request
Aug 14, 2026
#431) Completes AD-030 on the four gate-violating files #419 does not touch (.ai/RULES.md, AGENTS.md, CONVENTIONS.md, CHANGELOG.md) plus three unscanned tool-rule mirrors. Without this, #419 fails its own check-retired-claims gate on rebase. Wording copied verbatim from #419's CLAUDE.md; CHANGELOG.md uses the retired-ok escape hatch rather than falsifying release history. Verified: 4 violations to 0, and all remaining violations lie inside #419's file set.
Collaborator
Author
auto-merge was automatically disabled
August 16, 2026 11:14
Pull request was closed
runyourempire
added a commit
that referenced
this pull request
Aug 16, 2026
…de that does not exist (#466) Closes the documentation-truth findings from the forensic audit that were verified still open at `f26da1ea`. Every change makes a document match the code; where the code is the problem, this PR records the divergence rather than pretending it away. ## `CLAUDE.md` never received #431's drift correction #431 corrected five of the six agent-instruction mirrors. `CLAUDE.md` — the propagation root — got none of it, so the file every session loads first has been the wrong one. - **Design tokens.** `CLAUDE.md` listed `--bg-primary`, `--text-primary`, `--accent-gold`. The real names are `--color-`-prefixed (`src/App.css:8-26`). An agent following the doc verbatim produced CSS that silently did nothing. Verified independently: `--color-bg-primary` at `App.css:8`, and a light theme at `:49+` overrides the same token names, so the added "never hard-code a hex" note is load-bearing rather than decorative. - **The 60-line Rust function rule** was presented as enforced. It is not implemented anywhere, and `src-tauri/Cargo.toml:252` explicitly sets `too_many_lines = "allow"`. Now stated as a convention. - **`ts-rs` was wrong in all seven files**, not just `CLAUDE.md` — every one said v10; `src-tauri/Cargo.toml:27` pins `"12"`. - **Source count.** Every mirror said "20+". `build_all_sources()` registers **22** (counted: 22 `Box::new` entries). Mastodon and Lemmy were missing from every list, and `CVE/OSV` was written as one entry when it is two — which is exactly how 22 came to read as 20. ## Five INVARIANTS entries describe mechanisms that do not exist Verified by repo-wide grep. Each is now either corrected to what the code does or retired with its reason. | | Claimed | Actual | |---|---|---| | INV-001 | "precision MUST be >85%" | No 85% threshold exists. Real enforced floors: aggregate precision >= 0.70, F1 >= 0.40, per-persona noise rejection >= 80% (`scoring/simulation/reality.rs`) | | INV-023 | `STATIC_/ACTIVE_/LEARNED_LAYER_WEIGHT` | **Zero `.rs` hits.** Also still stale in `specs/ACE-STONE-TABLET.md` | | INV-041 | "ALL persistent state MUST live in SQLite" | Contradicted by four subsystems — `settings.json`, the OS keychain, `data/calibrations/`, `data/signal_terminal_token.txt` | | INV-060 | `ExclusionStrength` enum, "percentages are CANONICAL" | **Zero `.rs` hits** | | INV-071 | ">=5 exposures" | See below — it is worse than "3 not 5" | | INV-090 | warn at TS 350 / RS 600 | Gate uses ts 300 / tsx 350 / rs 700 | `.ai/FAILURE_MODES.md` documented the 2026-08-11 poisoned-curve incident as caused by state living outside SQLite **without naming the invariant that forbids it**. That cross-reference is now there. **INV-071 turned out to be three disagreeing gates, not one wrong number:** compute uses `>= 3` (`ace/behavior/tracking.rs:37`), read defaults to `>= 5` (`ace/behavior/queries.rs:11-12`), display uses `> 3` (`ace_commands/interactions.rs:429`) — and the explicit-rejection arm sits ahead of all three with **no exposure floor at all**, so a single dismissal of a never-engaged topic yields a negative affinity from one exposure. All four are recorded. The code is unchanged; this needs a decision, not a doc edit. ## Three in-code comments assert security properties the code does not have Comments only — zero behaviour change. False security comments are worse than none, because they stop the next reader from checking. - `settings/types.rs` — *"Must be true before cloud providers can be used."* No call site gates on `cloud_llm_disclosure_accepted`. INV-031 now says explicitly that consent is informed-disclosure, not an enforced gate; the comment now agrees. - `src-tauri/Cargo.toml` — *"debug-only dependency, stripped from release builds"* about `victauri-plugin`, which sits in `[dependencies]`, not `[dev-dependencies]`, under no `cfg(debug_assertions)` table. True only via the crate's own internal gating, which is now what it says. - `src-tauri/src/osv/sync.rs` — *"it never sends the user's dependency set anywhere."* True of the ZIP-mirror fallback only. `sync_ecosystem` POSTs the user's package names to `OSV_BATCH_URL` (up to 1000/request) and is attempted **first** on every cycle, so reaching that branch means disclosure already happened. ## Two things this PR deliberately does not do **AD-030 is out of scope.** PR #419 already contains the AD-030 entry, `scripts/check-retired-claims.cjs`, and the promise removal across 67 files. This PR touches none of it — `CLAUDE.md` edits here are confined to lines 46+ and do not go near the tagline. A trial merge against #419 is conflict-free. `specs/ACE-STONE-TABLET.md` gets not-built notes at the three blocks the false invariants were transcribed from, but is otherwise left intact as the historical design record rather than rewritten. ## Something that needs settling `.ai/RULES.md`'s own header says it is *"Generated from `CLAUDE.md` — the maintained source of truth"*, and explains `sync-ai-rules.sh` was deleted because it ran the other way and would clobber `CLAUDE.md`. That is the opposite of how the mirror set is usually described. All seven files are now consistent either way, so nothing is blocked — but one of those two statements is wrong and someone should decide which. ## Still open, for #419 `src/locales/en/ui.json` `firstRun.scanningDescription` still says "20 sources", as do all 12 other locales. Left alone because #419 owns the locale pass; fold 20→22 into it. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01Fq96xWyPQjx2bCCzWtsnC9 --------- Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
AD-030: retire the "gets sharper every day" promise — plus the last behavioral scoring path (dismissal-derived anti-topics feeding the negative stack), found by the post-#414 verification sweep.
New canonical, propagated from CLAUDE.md through every surface: "4DA reads the internet for developers — privately, locally. Your codebase decides what's relevant." "Yesterday's noise becomes tomorrow's signal" survives, re-attributed to corpus re-judging (true and implemented). The 92%/98% benchmark stays as body copy with methodology.
Why
The promise described a mechanism AD-029 removed, was never measurable (7 explicit feedback signals against a 200k corpus — "all risk, no demonstrated lift"), and post-v19 left ~100 self-contradicting instances, several asserting dead mechanisms inside Score Autopsy — live INV-023 violations. Public but unadvertised is the only cheap moment; after launch this is a retraction.
Scope
/calibrate-measured lift, published) + amendments to AD-017/025/026/028 — all four decisions survive; only rationales rewrite (AD-028's lifetime honesty now rests on the cost structure)mcp-v5.0.0publish)/writing/retiring-a-claim-we-could-not-measure/— the incident record as an engineering storyscripts/check-retired-claims.cjs(+9 tests) intest:scripts+validatebuild_negative_stackno longer accepts auto-detected anti-topics (0.30 suppression priors from dismissal counts); competing-tech inference over the real dependency graph onlyMerge-conflict note
src-tauri/src/blind_spots.rsis claimed by the livefix+title-truncationlane; this PR's change there is confined tobuild_negative_stack_from_deps(compile-required by the signature change).Verification
🤖 Generated with Claude Code
https://claude.ai/code/session_016puYGGmj3oHxmcKBbJ5vXq