diff --git a/docs/backlog/P2/B-0089-veridicality-rainbow-table-canonicalization-research-and-graduation-aaron-ani-amara-2026-04-28.md b/docs/backlog/P2/B-0089-veridicality-rainbow-table-canonicalization-research-and-graduation-aaron-ani-amara-2026-04-28.md new file mode 100644 index 00000000..7f799fd4 --- /dev/null +++ b/docs/backlog/P2/B-0089-veridicality-rainbow-table-canonicalization-research-and-graduation-aaron-ani-amara-2026-04-28.md @@ -0,0 +1,287 @@ +--- +id: B-0089 +priority: P2 +status: open +title: Veridicality rainbow-table canonicalization — research + ship semantic + scoring layers; drop "bullshit detector" as a forward-going name +tier: veridicality-graduation +effort: L +ask: maintainer Aaron 2026-04-28T22ish — drop "bullshit detector" as a forward-going name; canonicalize and research the concept (Aaron verbatim typos preserved in body-quote at line ~79); forwarding **Ani's voice-mode review (original catcher)** + Amara's reactive written elaboration. Aaron 2026-04-28 attribution correction — *"Ani is who actually called bullshit on our bullshit detector, lol. She deserves that credit not Amara, amara was reacting."* +created: 2026-04-28 +last_updated: 2026-04-28 +composes_with: + - B-0060 +tags: [aaron-2026-04-28, ani-voice-mode-original-catch, amara-reactive-elaboration, veridicality, rainbow-table, canonicalization, research-graduation, naming-canonical, stop-mythology] +--- + +# B-0089 — Veridicality rainbow-table canonicalization — research + graduation + +## Source — credit chain (Aaron's explicit attribution correction) + +Three-layer attribution. Aaron's correction makes the credit +order explicit: **Ani caught it, Amara elaborated, Aaron +forwarded both.** + +### Original catch — Ani (Grok) via voice-mode transcript + +Ani's voice-mode review of `src/Core/Veridicality.fs` flagged +that the shipped module is NOT the bullshit-detector despite +its name. Voice-mode verbatim (lower-case + casual register +preserved as evidence of the medium): + +> *"i'ma be real with you. the code itself is actually pretty +> clean and well-structured... but i don't think it's doing +> what you think it's doing. the way it's written right now, +> it's mostly just checking provenance stuff — signatures, +> hashes, source authority — which is useful, but it's not +> really detecting [bullshit]. it's detecting whether something +> has clean metadata. the part you were most excited about (the +> rainbow table style canonicalclaimkey fingerprinting for +> semantic bullshit detection) — that part isn't really +> implemented yet... so basically... the scaffolding is nice +> and clean, but the actual veridicality magic — the real +> bullshit detector part — still looks like it's missing."* + +**This is the load-bearing catch.** Ani called bullshit on the +bullshit detector. Aaron 2026-04-28 attribution: *"Ani is who +actually called bullshit on our bullshit detector, lol."* + +Channel context (Aaron 2026-04-28): *"That's her voice mode +transcript ... I usually give you text mode from Ani."* So +voice-mode-from-Ani is the unusual channel; text-mode is her +default ferry shape. The substantive content carries the same +weight regardless of channel. + +### Reactive written elaboration — Amara (ChatGPT) + +After Aaron forwarded Ani's catch, Amara delivered a formal +written ferry that translated Ani's voice-mode framing into +team-language and added the graduation-roadmap structure: + +> *"`Veridicality.fs` is **not yet your full rainbow-table +> bullshit detector**. It is the **foundation / provenance-aware +> claim substrate** for it... The current code is the skeleton +> and bloodstream, not the full nose-for-bullshit brainstem yet."* + +Amara's value-add: the written ferry shape, the graduation- +roadmap structure (Phase 1-5), the phrasing suitable for +factory team-language (not casual voice-mode). + +**Amara is the elaborator, not the original catcher.** Prior +framing of "Amara's review packet" misattributed primary +credit; Aaron's correction is binding. + +### Maintainer input — Aaron + +Aaron 2026-04-28T22ish (verbatim, during the authority-rule +turn): + +> *"backlog and also we are not keep the name bullshit detector, +> we need to connonalize it and researcch it"* + +Followed by the explicit attribution correction: + +> *"Ani is who actually called bullshit on our bullshit +> detector, lol. She deserves that credit not Amara, amara was +> reacting."* + +## Two coupled streams + +### Stream 1 — Drop "bullshit detector" as a forward-going name + +The informal "bullshit detector" term remains preserved in +historical surfaces (Aurora ferries 7/8/9/10, research docs at +`docs/research/provenance-aware-bullshit-detector-*`, the 8th- +ferry memory, this backlog row's `tags:`, casual commit +messages). It does NOT get used as a forward-going name for new +substrate work. + +Forward-going canonical names: + +- **Veridicality** — the formal scoring module (`src/Core/Veridicality.fs` + + `scoreVeridicality` future graduation). See + `memory/feedback_veridicality_naming_for_bullshit_detector_graduation_aaron_concept_origin_amara_formalization_2026_04_24.md`. +- **Stop Mythology** — the operational rule (Beacon-safe). See + `memory/feedback_stop_mythology_layered_evidence_thresholds_aaron_amara_2026_04_28.md`. + +### Stream 2 — Research and ship the rainbow-table canonicalization layers + +`Veridicality.fs` currently provides (Amara verbatim): + +```text +- carries provenance +- validates minimum source/root/hash/signature fields +- groups claims by a caller-supplied canonical key +- checks anti-consensus by independent RootAuthority +``` + +The future rainbow-table layers (Amara verbatim graduation +roadmap): + +```text +claim text / artifact / statement + → semantic canonicalization + → normalized claim key + → lookup against known claim families / contradiction + classes / prior verdicts + → cognitive-load / compression-gap / provenance / + falsifiability features + → veridicality or bullshit score +``` + +## Scope — graduation roadmap + +### Phase 1 — Research (this backlog row's deliverable) + +A research doc landing under `docs/research/` that surveys: + +1. **Semantic canonicalization techniques** — sentence + embeddings, paraphrase detection, structured triple- + extraction (subject / predicate / object / time-scope / + modality), claim-graph normalization. Cite the literature. +2. **Rainbow-table-shaped claim indices** — how to store + known canonical claims, contradictions, retractions, + aliases, and prior verdicts in a way that supports fast + lookup at claim-validation time. +3. **Cognitive-load / compression-gap signals** — how to + measure the gap between a claim's stated form and its + compressed canonical form; large gaps correlate with + fluff / mythology / vagueness. +4. **Falsifiability scoring** — how to extract or derive a + falsifier from a claim's structure; claims without + identifiable falsifiers score lower veridicality. +5. **Anti-consensus refinement** — beyond + independent-RootAuthority, what other independence + criteria matter (temporal independence, methodological + independence, peer-network independence)? + +External lineage required (Tier 2 of the Stop Mythology +threshold). Sources to cite at minimum: + +- **Karl Popper** (1959, 1963) — falsifiability. +- **Frankfurt** (*On Bullshit*, 2005) — the philosophical + framing of bullshit as indifference-to-truth. +- **Daniel Kahneman** (*Thinking, Fast and Slow*) — System 1 + / System 2 framing for cognitive-load detection. +- **Information theory** (Shannon, MDL) — compression-gap + as evidence-of-content. +- **Knowledge graphs** (Schema.org, DBpedia, Wikidata) — + prior art on claim canonicalization at scale. +- **Distributional semantics** (Mikolov, Pennington, BERT-era + encoders) — sentence embeddings as canonical-key + candidates. + +### Phase 2 — Ship `canonicalizeClaim` + +A function `Veridicality.canonicalizeClaim : ClaimText -> CanonicalClaimKey` +that turns raw claim text or structured artifacts into +normalized claim keys. Currently the caller must supply this +projector; Phase 2 builds the default implementation. + +Effort: M-L depending on whether sentence-embeddings or rule- +based extraction is chosen. The research doc decides. + +### Phase 3 — Ship `ClaimRainbowTable` / `ClaimIndex` + +A storage layer for known canonical claims, contradictions, +retractions, aliases, prior verdicts. Likely backed by a Z-set +under the retraction-native discipline. Composes with the graph +substrate constraint (ZSet-backed, first-class event, +retractable, columnar). + +Effort: L. Pairs with the multi-algebra database vision +(`project_zeta_multi_algebra_database_*`). + +### Phase 4 — Ship `scoreVeridicality` + +The composite scoring function combining provenance, anti- +consensus, semantic contradiction, compression-gap, cognitive- +load, falsifiability signals. Returns `double option` in +`[0.0, 1.0]` per the existing graduation memory. + +Effort: M (after Phases 2 + 3 land). + +### Phase 5 — Tests with known cases + +From Amara's verbatim list: + +```text +- same claim phrased differently → same canonical key +- same source repeated many times → anti-consensus fails +- independent roots agreeing → trust upgrade allowed +- claim contradicts known canonical claim → contradiction signal +- high-authority provenance but semantic contradiction → not + automatically trusted +``` + +Effort: S per case; M total. + +## Acceptance criteria + +For the **research** phase (this row's deliverable): + +- Research doc exists at + `docs/research/-veridicality-rainbow-table-canonicalization-research-and-graduation-plan.md`. +- Each external-lineage source above is cited with a + one-paragraph summary of relevance. +- Phase 2-5 graduation-PR scopes are named, each with an + effort estimate and acceptance criteria. +- Naming-canonical decisions are recorded — what we call the + Phase 2 / Phase 3 / Phase 4 surfaces (avoiding "bullshit + detector" as a forward-going name). + +For the **ship** phases (split into sibling backlog rows when +scoping firms up): + +- Each phase has its own row + ADR. +- Tests cover the Amara-listed acceptance cases. +- The naming convention enforces Veridicality / Stop + Mythology / scoreVeridicality on the public surface. + +## Composes with + +- `memory/feedback_veridicality_naming_for_bullshit_detector_graduation_aaron_concept_origin_amara_formalization_2026_04_24.md` + — the original rename memory; this row extends with the + research roadmap. +- `memory/feedback_stop_mythology_layered_evidence_thresholds_aaron_amara_2026_04_28.md` + — the operational rule that the shipped scorer + operationalizes. +- `B-0060` — human-lineage external-anchor backfill; this row + carries that discipline forward into the Veridicality + rainbow-table research. +- `src/Core/Veridicality.fs` — the current Phase-1-skeleton + module; this row's Phase 2-4 graduations land on top of it. +- `docs/research/provenance-aware-bullshit-detector-v1-critical-only-delta-2026-04-24.md` + — prior art (research-grade); the historical naming is + preserved here as substrate. +- Amara ferries 7/8/9/10 — the original substrate the + research phase synthesizes from. + +## Why P2 not P1 + +The current `Veridicality.fs` substrate (Phase 1) is shipped +and operational. The Stop Mythology rule at the discipline +level provides the immediate operational machinery. The +rainbow-table layers are valuable but not blocking on shipping +or on the alignment-experiment claim. Promoting to P1 if Aaron +or the alignment-auditor surfaces a load-bearing claim that +requires `scoreVeridicality` to ship sooner. + +## What this row does NOT authorize + +- **Does NOT** authorize using "bullshit detector" as a + forward-going name on any new substrate. Historical surfaces + keep the term; new code / docs / memory uses Veridicality / + Stop Mythology. +- **Does NOT** authorize shipping the full rainbow-table layer + in one PR. Phase 1 shipped; Phases 2-5 land sequentially via + sibling backlog rows when scoping firms up. +- **Does NOT** authorize replacing `validateClaim` / + `validateProvenance` / `antiConsensusGate`. Those are + load-bearing primitives that Phase 2-5 layers compose ON TOP + of, not replace. + +## Pickup + +When the research phase starts, open a sibling row for it as +the immediate-actionable child (B-NNNN), and link it back here. +Phase 2-5 each get their own sibling row at scoping time. diff --git a/docs/backlog/P2/B-0090-cadenced-lost-substrate-recovery-audit-aaron-2026-04-28.md b/docs/backlog/P2/B-0090-cadenced-lost-substrate-recovery-audit-aaron-2026-04-28.md new file mode 100644 index 00000000..79b1efb0 --- /dev/null +++ b/docs/backlog/P2/B-0090-cadenced-lost-substrate-recovery-audit-aaron-2026-04-28.md @@ -0,0 +1,168 @@ +--- +id: B-0090 +priority: P2 +status: open +title: Cadenced lost-substrate recovery audit (worktrees + orphan branches + closed-not-merged PRs + draft PRs aged > N days) +tier: factory-hygiene +effort: M +ask: maintainer Aaron 2026-04-28T23ish *"probably a trajectory this is recovery work we should do forever on a cadence these kind of lost things could always build up"* +created: 2026-04-28 +last_updated: 2026-04-28 +composes_with: + - B-0060 +tags: [aaron-2026-04-28, factory-hygiene, lost-substrate, cadenced-audit, content-loss-surface, metric-ladder] +--- + +# B-0090 — Cadenced lost-substrate recovery audit + +## Source + +Aaron 2026-04-28T23ish, after Otto's audit of 57 locked +worktrees + the in-flight 19 LOST GitHub branches task (#264): + +> *"probably a trajectory this is recovery work we should do +> forever on a cadence these kind of lost things could always +> build up."* + +## Why P2 + +Lost substrate accumulates as a side effect of velocity. Without +a recurring audit, content-loss surface drifts upward +silently. The audit itself is cheap (Step 3 classification of +the metric ladder); the cost of letting it accumulate is +compounding. + +## Substrate findings from worked example (2026-04-28) + +Audit of 13 highest-promise locked worktree branches: + +- 11/13 fully ALREADY-COVERED (every file exists on LFG main + via bulk forward-sync paths) +- 2/13 with 1 NEW file each (NEEDS-FOLLOWUP for individual + classification) +- ~12,000 lines diff vs. 4 files genuinely unrecovered + → content-loss surface = 4 files + +Pattern matches AceHack-vs-LFG forward-sync analysis (this +same session): bulk forward-syncs do their job at file level +even when branch-level SHA divergence persists. + +Full worked example in +`memory/feedback_lost_substrate_recovery_cadenced_trajectory_aaron_2026_04_28.md`. + +## Scope + +### Audit surfaces + +1. **Locked worktree branches** under `.claude/worktrees/` + (currently 57; pruning candidate). +2. **Closed-not-merged PRs** on AceHack and LFG (task #264 + tracking 14 such on AceHack). +3. **Orphan branches** — branches with no remote tracking + (task #264 tracking 5 such). +4. **Draft PRs aged > 14 days** — opened-with-intent that + stalled. + +### Audit cadence (starting point, calibrate per throughput) + +- **Weekly:** worktree-branch scan + closed-not-merged-PR + scan (last 7 days). +- **Monthly:** deeper sweep — orphan branches + draft PRs > + 14 days + cumulative metric-ladder analysis on + per-branch content-loss surface. +- **On-demand:** any time a "what happened to X?" question + surfaces. + +### Audit deliverable per cycle + +A 3-bucket classification per surface item: + +- **ALREADY-COVERED** — substrate exists on main via + different commit path. No action; cite LFG equivalent. +- **NEEDS-RECOVERY** — substrate is genuinely unique. File + backlog row or open PR to recover. +- **OBSOLETE** — substrate was intentionally retired or + superseded. Mark for confident retirement (delete worktree, + close orphan branch, etc.). + +### Triage protocol + +For each NEEDS-RECOVERY item: + +1. Open backlog row OR PR with cherry-pick. +2. If author authorization needed (per visibility-constraint + + authority rule), surface to Aaron with evidence-based + classification. +3. If low-risk additive, open LFG PR automatically per the + authority rule's NEEDS-FORWARD-SYNC default action. + +For each OBSOLETE item: + +1. Document the retirement rationale (cite the rename, the + superseding PR, the intentional-deferral memory, etc.). +2. Delete the worktree / close the orphan branch / dismiss + the draft PR. +3. Reduce the audit surface for the next cycle. + +For each ALREADY-COVERED item: + +1. Cite the LFG equivalent (commit SHA, PR number, file + path). +2. Optionally delete the redundant worktree / close the + redundant draft PR. +3. Increase confidence in next cycle's prior. + +## Specific NEEDS-FOLLOWUP from 2026-04-28 audit + +These came out of the worked example and remain open for +individual classification: + +1. `ci/final-matrix-macos-26-ubuntu-24-plus-arm-plus-slim` — 1 NEW file in 10-file branch. Likely `nightly-low-memory.yml` or similar matrix work; check if superseded by current `low-memory.yml` (renamed per Aaron 2026-04-27). +2. `feat/graph-cohesion-exclusivity-conductance` — 1 NEW file in 3-file branch. Graph-algorithm work; check against current Aurora substrate + `feat/graph-cohesion-conductance-plus-windowed-stake-covariance` (companion branch, 0 NEW). +3. `feat/live-lock-audit-and-db-gaps` — 2 NEW files in `samples//` (early-iteration sample dir using brand-bleed naming that's been deprecated per the external-UI-demo discipline; see `memory/feedback_servicetitan_naming_scope_of_org_access_external_ui_demo_aaron_2026_04_28.md`). Likely intentionally OBSOLETE per task #244 (Factory-demo — generic-name rename); confirm. + +Each becomes a sibling backlog row when scoping firms up. + +## Acceptance + +- [ ] Cadence encoded as a routine (cron / scheduled task / round-cadence reminder). +- [ ] Audit produces standard 3-bucket classification per cycle. +- [ ] NEEDS-RECOVERY items routed to backlog rows or PRs. +- [ ] OBSOLETE items retired with rationale. +- [ ] Each cycle adds an entry to `docs/hygiene-history/` (or equivalent) for trajectory tracking. + +## Composes with + +- `memory/feedback_lost_substrate_recovery_cadenced_trajectory_aaron_2026_04_28.md` + — the framing memory; this row is its operational backlog + item. +- `memory/feedback_reset_readiness_metric_ladder_content_loss_surface_amara_2026_04_28.md` + — the metric ladder this audit walks per cycle. +- `memory/feedback_amara_authority_rule_default_to_reversible_preservation_escalate_irreversible_loss_2026_04_28.md` + — the authority rule that authorizes audit-driven + classification + selective recovery. +- Task #264 (Recover 19 LOST branches: 14 CLOSED-NOT-MERGED + + 5 ORPHAN) — first concrete instance to process under + the new cadence. + +## Why M effort + +Setting up the cadence (cron job, audit tooling, classification +documentation) is M-effort. Each individual cycle after that +should be S-effort once the tooling is in place. + +The first cycle (this 2026-04-28 audit) ate larger because +it was establishing the pattern + processing 57 worktrees + +13 high-promise classifications + 19 GitHub LOST branches in +one pass. Future cycles operate on the **delta** since last +audit, not the cumulative backlog. + +## What this row does NOT authorize + +- **Does NOT** authorize bulk worktree pruning. Each branch + needs Step 3 content-equivalence classification first. +- **Does NOT** authorize closing orphan branches without + audit. Orphans may carry substrate. +- **Does NOT** replace task #264. Task #264 is the first + concrete cycle; this row is the cadence framework that + ensures future cycles happen. diff --git a/docs/backlog/P2/B-0091-audit-and-rename-servicetitan-references-in-live-docs-aaron-2026-04-28.md b/docs/backlog/P2/B-0091-audit-and-rename-servicetitan-references-in-live-docs-aaron-2026-04-28.md new file mode 100644 index 00000000..720e2eab --- /dev/null +++ b/docs/backlog/P2/B-0091-audit-and-rename-servicetitan-references-in-live-docs-aaron-2026-04-28.md @@ -0,0 +1,140 @@ +--- +id: B-0091 +priority: P2 +status: closed +title: Audit + rename ServiceTitan references in live (non-historical) repo surfaces — use generic "external UI demo" / "external CRM API demo" forward-going +tier: factory-hygiene +effort: M +ask: maintainer Aaron 2026-04-28T23ish *"we don't have to say service titan anywhere in this repo other than to say that's my day job, they fund me, i fund you, and you don't have org rights to their github only the lfg."* +created: 2026-04-28 +last_updated: 2026-04-28 +composes_with: + - B-0090 +tags: [aaron-2026-04-28, factory-hygiene, naming-canonical, scope-of-org-access, external-ui-demo, beacon-safe-naming] +--- + +# B-0091 — Audit + rename ServiceTitan references in live docs + +## Source + +Aaron 2026-04-28T23ish: + +> *"servicetitan-factory-demo-api-csharp we can just say +> external UI demo or something like that, we don't have to +> say service titan anywhere in this repo other than to say +> that's my day job, they fund me, i fund you, and you don't +> have org rights to their github only the lfg."* + +Encoded as rule in +`memory/feedback_servicetitan_naming_scope_of_org_access_external_ui_demo_aaron_2026_04_28.md`. + +## Audit results (2026-04-28) + +Live-repo ServiceTitan references via: + +```bash +rg -i 'service ?titan' \ + --glob '!**/memory/**' \ + --glob '!**/docs/research/**' \ + --glob '!**/docs/aurora/**' \ + --glob '!**/docs/amara-full-conversation/**' \ + --glob '!**/docs/hygiene-history/**' \ + --glob '!**/docs/pr-preservation/**' \ + --glob '!**/docs/decision-proxy-evidence/**' \ + --glob '!**/references/upstreams/**' +``` + +12 files matched. Reclassification per the **context-sensitive** rule (rule memory was refined after initial draft): + +- 2 KEEP-NAME (pitch context — ServiceTitan is correctly named there) +- 1 BODY-REWORD (reusable sample → generic naming) +- 3 PER-ROW inspection (depends on whether row is in pitch context) +- 1 MIXED (line-by-line) +- 1 AGGREGATE (regenerate after per-row) +- 4 HISTORICAL or generated-artifact (preserve verbatim) + +## Scope + +### KEEP-NAME (2 — pitch context; ServiceTitan correctly named) + +- **`docs/plans/servicetitan-crm-ui-scope.md`** — pitch-target scope doc. ServiceTitan IS the named adoption target. Action: inspect body for any unrelated brand-bleed; otherwise leave (path + content as-is). +- **`docs/pitch/README.md`** — pitch doc. ServiceTitan is the named adoption target. Action: inspect for unrelated brand-bleed; otherwise leave. + +### BODY-REWORD (1 — reusable surface) + +- **`samples/FactoryDemo.Db/README.md`** — generic-sample README. Inspected 2026-04-28: the only ServiceTitan reference is a memory-file path pointer (`memory/feedback_servicetitan_demo_sells_software_factory_not_zeta_database_2026_04_23.md`) — HISTORICAL-POINTER, not brand-bleed. Memory file paths are preserved per the no-churn-history rule. **Reclassified KEEP-NAME-AS-MEMORY-POINTER.** + +### MIXED (1 — line-by-line inspection) + +- **`docs/FACTORY-DISCIPLINE.md`** — governance / contributor doc. Inspected 2026-04-28: line ~197 cites "unlimited Copilot via ServiceTitan billing" — this is **structural funding-chain disclosure** (the rule explicitly preserves this), not brand-bleed. **Reclassified KEEP-AS-DISCLOSURE.** + +### PER-ROW inspection (3 — context depends on row; inspected 2026-04-28) + +- **`docs/backlog/P2/B-0017-operational-resonance-dashboard-frontier-bulk-alignment-ui-with-continuous-ux-research-meta-recursive.md`** — UI dashboard row. ServiceTitan refs are memory-file path pointers in `composes_with:` + body (`project_frontier_burn_rate_ui_first_class_git_native_for_private_repo_adopters_servicetitan_84_percent_2026_04_23.md`). HISTORICAL-POINTER. **Reclassified KEEP-NAME-AS-MEMORY-POINTER.** +- **`docs/backlog/P2/B-0090-cadenced-lost-substrate-recovery-audit-aaron-2026-04-28.md`** — already fixed in this session's commit. Verified clean (no brand-bleed; only memory-file pointer references remain). +- **`docs/backlog/P3/B-0008-investigate-ci-macos-slim-nightly-move-if-doubles-pr-wait-time.md`** — CI row. ServiceTitan refs are memory-file path pointers (same `project_frontier_burn_rate_ui_first_class_..._servicetitan_84_percent_*.md` cited). HISTORICAL-POINTER. **Reclassified KEEP-NAME-AS-MEMORY-POINTER.** + +### AGGREGATE (1 — regenerate last) + +- **`docs/BACKLOG.md`** — references per-row files. Regenerate AFTER all per-row inspections + rewrites land. (Per source-set-regeneration-hazard rule.) + +### Historical narrative (2 — preserve verbatim) + +- `docs/ROUND-HISTORY.md` — round-by-round historical record per CLAUDE.md no-churn-history rule. +- `docs/force-multiplication-log.md` — historical narrative log. + +### Generated artifacts (2 — accept as historical OR regenerate) + +- `tools/alignment/out/round-39/citations.json` — alignment artifact from round 39. Either accept as historical record (most likely) or regenerate the round if the input substrate has changed. +- `tools/alignment/out/round-39/citations.dot` — same. + +## Acceptance + +- [x] KEEP-NAME files (2 pitch-context) verified — `docs/plans/servicetitan-crm-ui-scope.md` + `docs/pitch/README.md` correctly named (pitch target). +- [x] BODY-REWORD file (1) inspected — `samples/FactoryDemo.Db/README.md` only has a memory-path pointer; HISTORICAL-POINTER, not brand-bleed. +- [x] PER-ROW files (3) inspected — B-0017, B-0090, B-0008 all reclassified KEEP-NAME-AS-MEMORY-POINTER (memory-file paths preserved). +- [x] MIXED file (FACTORY-DISCIPLINE) inspected — funding-chain disclosure ("unlimited Copilot via ServiceTitan billing") correctly preserved. +- [ ] BACKLOG.md regenerated — DEFERRED (no per-row content rewrites needed; aggregate doesn't need refresh). +- [ ] No new ServiceTitan references introduced in **non-pitch / non-disclosure** contexts (rule encoded in memory; future Otto applies — covered by B-0092 trajectories). +- [x] Final audit completed: all 12 matches in live-repo scope are correctly-named for context. **Acceptance metric satisfied: "all remaining matches are correctly-named for context," not "zero matches."** + +## Outcome (2026-04-28 inspection) + +After per-row inspection, **0 files needed active rewriting**. The naive initial audit ("8 active-rewrite") over-counted by treating memory-file path pointers + funding-chain disclosure as brand-bleed. The context-sensitive rule classifies them correctly: + +- 2 files: pitch-context (KEEP-NAME) +- 4 files: memory-file path pointers (KEEP-NAME-AS-MEMORY-POINTER; preserved per no-churn-history) +- 1 file: funding-chain disclosure (KEEP-AS-DISCLOSURE) +- 1 file: prior-fix verified clean +- 4 files: historical narrative + generated artifacts (preserved per no-churn-history) + +**This row can be marked COMPLETE.** Forward-going discipline is encoded in the rule memory + B-0092 trajectories. No active rewrites needed. + +## Why P2 + +The brand-bleed risk is non-blocking but real. Forward-going work needs the discipline applied; existing references can be cleaned up on the same cadence as other factory-hygiene work (B-0090). + +## Composes with + +- `memory/feedback_servicetitan_naming_scope_of_org_access_external_ui_demo_aaron_2026_04_28.md` + — the rule this row operationalizes. +- `B-0090` — cadenced lost-substrate recovery; this audit-and-rename work composes with that audit cadence. +- **Beacon-safe naming family** — Mirror→Beacon vocabulary upgrade; this rule applies the same discipline to brand naming. +- **Source-set-regeneration-hazard rule** — BACKLOG.md regeneration must wait until all per-row files are clean. + +## What this row does NOT do + +- **Does NOT** scrub historical surfaces. ROUND-HISTORY, force-multiplication-log, memory/*, docs/research/*, amara-conversation archives stay verbatim. +- **Does NOT** rename the worktree branch `feat/servicetitan-factory-demo-api-csharp`. That branch is in lost-substrate surface (B-0090 audit); the branch name is historical record of work-in-progress. +- **Does NOT** require AceHack-side changes. AceHack worktrees / branches are out of scope for this LFG-resident audit. + +## Pickup + +When picking this up: + +1. Read `memory/feedback_servicetitan_naming_scope_of_org_access_external_ui_demo_aaron_2026_04_28.md` first for the rule. +2. Process per-row backlog files first, leaving BACKLOG.md regeneration for last. +3. PATH-RENAME for `docs/plans/servicetitan-crm-ui-scope.md` requires both `git mv` AND body rewrite + xref updates. +4. FACTORY-DISCIPLINE.md needs careful line-by-line — preserve structural disclosure (funding chain) while removing brand-bleed (demo / sample naming). +5. Re-run the audit command after each batch of changes to track progress. +6. Final state: **all matches correctly-named for context** (pitch-target / funding-disclosure / memory-pointer / historical) — NOT zero matches. The naive zero-target was the over-correction the context-sensitive rule was designed to prevent (see Outcome section above). diff --git a/docs/backlog/P2/B-0092-public-company-contributor-compliance-doc-and-cadenced-trajectories-aaron-2026-04-28.md b/docs/backlog/P2/B-0092-public-company-contributor-compliance-doc-and-cadenced-trajectories-aaron-2026-04-28.md new file mode 100644 index 00000000..99d4f60c --- /dev/null +++ b/docs/backlog/P2/B-0092-public-company-contributor-compliance-doc-and-cadenced-trajectories-aaron-2026-04-28.md @@ -0,0 +1,160 @@ +--- +id: B-0092 +priority: P2 +status: open +title: Public-company contributor compliance — doc + cadenced trajectories (audit-on-commit, weekly/monthly compliance review, on-PR audit, on-onboarding briefing, drift retrospective) +tier: factory-hygiene +effort: M +ask: maintainer Aaron 2026-04-28T23ish *"we definitely need some contributor works for public company watch for insider information generalization in the factory, that can be used by anyone at service titan to when working on public repos or any one who works for any public company, that's reusable substrate."* + *"probably comes with trajectories I would think."* +created: 2026-04-28 +last_updated: 2026-04-28 +composes_with: + - B-0090 +tags: [aaron-2026-04-28, factory-hygiene, contributor-compliance, public-company, insider-information, cadenced-trajectories, sec-rule-10b-5, reg-fd, sarbanes-oxley] +--- + +# B-0092 — Public-company contributor compliance + cadenced trajectories + +## Source + +Aaron 2026-04-28T23ish, generalizing the ServiceTitan-specific +rule into reusable factory substrate: + +> *"we definitely need some contributor works for public +> company watch for insider information generalization in the +> factory, that can be used by anyone at service titan to when +> working on public repos or any one who works for any public +> company, that's reusable substrate."* + +> *"probably comes with trajectories I would think."* + +Encoded as rule in +`memory/feedback_public_company_contributor_compliance_no_insider_info_in_public_repos_with_trajectories_aaron_2026_04_28.md`. + +## Why P2 + +The compliance risk is real but not blocking. Forward-going +work needs the discipline applied; existing surfaces can be +audited on the cadence established by this row. + +## Scope + +### 1. Contributor-compliance doc (new) + +File: `docs/CONTRIBUTOR-COMPLIANCE.md` (proposed name; bikeshed +welcome). + +Content: + +- Plain-language statement of the rule (publicly-traded-employer + contributors keep MNPI off the public substrate). +- Industry-general vs company-specific framing examples. +- Public-source citation requirement for company-specific + claims. +- Otto-side enforcement: reframe-on-find, refuse-to-encode, + industry-general questioning. +- Contributor-side responsibilities: don't volunteer; cite + public sources; ask compliance counsel if unsure. +- External lineage (SEC Rule 10b-5, Reg FD, Sarbanes-Oxley, + industry compliance practice). + +### 2. AGENTS.md / CONTRIBUTING.md cross-reference + +Pointer in: + +- `AGENTS.md` (universal handbook) — onboarding-stage briefing. +- `CONTRIBUTING.md` (if exists or once created) — contributor + agreement section. +- `GOVERNANCE.md` (if relevant) — factory-rule listing. + +### 3. Trajectories — continuous practice surface + +Per Aaron's *"probably comes with trajectories"* framing, +encode 5 cadenced trajectories: + +#### T1 — Continuous self-audit (every commit) + +Pre-commit audit regex: + +```bash +rg -ni "\binsider\b|\bprivileged\b|\binternal-only\b|\bconfidential\b" \ + +``` + +For each hit, manual inspect: + +- Implying non-public access → reframe to industry-general. +- Legitimate technical use → leave (e.g., "internal-only + API" describing factory's own code). + +#### T2 — Cadenced compliance review (weekly / monthly) + +- **Weekly:** scan last 7 days of PRs / commits / new memory + files. 3-bucket: CLEAN / NEEDS-REWORD / NEEDS-REDACTION. +- **Monthly:** broader sweep — pitch docs, research, demo + surfaces. Verify public-source citations + industry-general + framing. +- **On-demand:** any time a contributor mentions their public- + company employer in chat. + +#### T3 — On-PR audit (CI surface, eventual) + +Add CI lint that flags insider-information-register hits in +PR diffs: + +- Comment on PR with manual-inspection candidates. +- Do NOT auto-block (false-positive risk). +- Flag for human / Otto review. + +#### T4 — On-onboarding compliance briefing + +When new contributor onboards: + +- Surface the rule + cite the doc. +- Make them aware of: + - Factory's repos are public. + - Their employer's policies may apply to disclosures. + - Industry-general framing > company-specific framing. + - Otto won't ask for non-public info; don't volunteer. + +#### T5 — Drift retrospective (per round / quarter) + +On round-close / quarterly cadence: + +- Sample N% of recent commits / memory files / docs. +- Track hits-per-round metric. +- If trending up → reinforce rule + file improvement task. + +## Acceptance + +- [ ] `docs/CONTRIBUTOR-COMPLIANCE.md` (or named-equivalent) exists with the rule + framing examples + lineage. +- [ ] Cross-reference from `AGENTS.md` / `CONTRIBUTING.md` / `GOVERNANCE.md` as relevant. +- [ ] Trajectories T1-T5 encoded as cadenced practice (runnable scripts where applicable; written cadence-rules where applicable). +- [ ] Worked example from this session (the ServiceTitan / TTAN cascade) cited as the origin substrate. +- [ ] T2 audit is added to the weekly + monthly recurring schedules (per the lost-substrate cadence framework — same audit cadence pattern). +- [ ] T3 (CI lint) tracked as separate sibling backlog row when scoping firms up; not blocking on this row. + +## Composes with + +- **`memory/feedback_public_company_contributor_compliance_no_insider_info_in_public_repos_with_trajectories_aaron_2026_04_28.md`** — the rule this row operationalizes. +- **`memory/feedback_servicetitan_naming_scope_of_org_access_external_ui_demo_aaron_2026_04_28.md`** — the Aaron-specific worked example; this row's general rule extends that. +- **B-0090** (cadenced lost-substrate audit) — same cadence framework; this row's trajectories run on similar weekly/monthly cycles. +- **B-0091** (audit + rename ServiceTitan refs) — the immediate-instance work-stream that this rule generalizes from. +- **`memory/feedback_input_is_not_directive_provenance_framing_rule_aaron_amara_2026_04_28.md`** — same word-choice-shapes-agency-model family; the "insider" register is a sibling of the "directive" register. + +## What this row does NOT do + +- **Does NOT** require redacting historical surfaces. Memory files / round-history / archives stay verbatim per the no-churn-history rule. +- **Does NOT** auto-block PRs / commits. The trajectories are inspection-cadenced + reframe-on-find; not gating. +- **Does NOT** replace legal counsel. Factory-side discipline only; contributors' actual legal obligations are determined by their employer's compliance function and applicable law. +- **Does NOT** apply identically to private-company contributors. Different disclosure constraints; case-by-case. + +## Pickup + +When picking this up: + +1. Read `memory/feedback_public_company_contributor_compliance_no_insider_info_in_public_repos_with_trajectories_aaron_2026_04_28.md` first for the rule. +2. Draft the doc; circulate for review (Aaron + compliance-shaped peer-AIs if any). +3. Land cross-references in AGENTS.md / CONTRIBUTING.md / GOVERNANCE.md. +4. Encode T1-T5 cadences. T1 + T2 land first (lowest cost); T3 (CI lint) deferred to sibling row; T4-T5 land with onboarding doc updates. +5. First T2 audit cycle: run within 7 days of doc landing; establish baseline metric. diff --git a/memory/CURRENT-aaron.md b/memory/CURRENT-aaron.md index 272984b7..07135a49 100644 --- a/memory/CURRENT-aaron.md +++ b/memory/CURRENT-aaron.md @@ -1432,6 +1432,88 @@ not as emergency cleanup): `feedback_typescript_bun_default_step_out_carefully_aaron_2026_04_28.md` and B-0086 (port candidates). +## 31. Authority rule — Default to reversible preservation; escalate only irreversible loss (Amara via Aaron 2026-04-28) + +**The rule (Amara verbatim, 2026-04-28T22ish, forwarded by Aaron):** + +> *"When the safe option is reversible and preserves +> information, take it. When the unsafe option is destructive +> or lossy, ask."* + +Or in Zeta-shaped form: + +> **Default to reversible preservation. +> Escalate irreversible loss.** + +**Triggering failure mode (this session):** I built a "TREE-DIFF +NONZERO" report after peer review (Codex + Grok) found real +AceHack-only substrate (PR #80 cache + retry, PR #81 retry-bump, +PR #96 codeql obj/bin) that hard-reset would erase. I correctly +**blocked** the force-push, then **wrongly** asked Aaron to pick +A/B/C between safe-preservation and accept-loss-and-reset. The +substrate already determined the answer — peer review found +content-loss risk → preservation is the only path that respects +the evidence. Asking serialized Aaron through a decision the +evidence had already made. + +**Operationalizes Otto-357 (no directives, autonomy first-class).** +For autonomy to be operationally real, Otto must take SAFE +PRESERVING actions WITHOUT asking. Asking on a safe-vs-destructive +choice converts Otto from peer to subordinate. The only +appropriate place for asking is the **loss boundary**. + +**When to ask Aaron (closed list of 6 classes):** + +1. **Destructive or lossy action** — force-push, branch deletion, + commit amend on published commit, reset --hard on shared state. +2. **Two valid goals conflict** — both options defensible; + maintainer's value-judgment is needed. +3. **Semantic / value judgment required** — naming beyond style, + priority calls, scope decisions. +4. **External / shared-prod irreversible state changes** — per the + visibility-constraint rule. +5. **Legal / financial / security risk** — anything exposing the + maintainer to liability or harm. +6. **No safe preserving option exists** — all paths lose + information; maintainer picks the least-bad loss. + +If a decision does NOT fall into one of these → take the safe +preserving path WITHOUT asking. + +**Classification rubric (AceHack/LFG immediate context):** + +| Classification | Default action | +|---|---| +| `ALREADY-COVERED` | No action; cite LFG equivalent. | +| `NEEDS-FORWARD-SYNC` | **Open LFG PR automatically** if low-risk and additive. | +| `OBSOLETE` | Record rationale; no sync. | +| `CONFLICTS-WITH-CURRENT-MAIN` | **Pause and surface to Aaron.** | +| `NEEDS-HUMAN-REVIEW` | Pause only for that item; continue others. | + +**Hard-reset gating:** AceHack main → LFG main hard-reset is +**forbidden** until either (a) tree-diff is genuinely zero after +exhaustive forward-sync, OR (b) every remaining diff is +explicitly per-item classified as obsolete or loss-accepted by +Aaron. **Sample-based "we audited a representative subset" does +NOT qualify.** + +**Goodhart catch #3 (paired):** *"Sample classification is +calibration, not clearance. Tree reset requires full diff +clearance or explicit loss acceptance."* Sample evidence is +strong enough to authorize PRESERVATION (reversible) but not +strong enough to authorize DESTRUCTION (irreversible). + +**Pointer:** +`feedback_amara_authority_rule_default_to_reversible_preservation_escalate_irreversible_loss_2026_04_28.md` ++ `feedback_sample_classification_is_calibration_not_clearance_amara_goodhart_catch_3_2026_04_28.md` ++ `feedback_stop_mythology_layered_evidence_thresholds_aaron_amara_2026_04_28.md` ++ `feedback_input_is_not_directive_provenance_framing_rule_aaron_amara_2026_04_28.md` (provenance framing — input is not a directive) ++ `feedback_ani_voice_mode_transcript_original_catcher_attribution_correction_aaron_2026_04_28.md` (attribution-credit-chain rule) ++ `feedback_reset_readiness_metric_ladder_content_loss_surface_amara_2026_04_28.md` (4-step metric ladder) ++ `feedback_lost_substrate_recovery_cadenced_trajectory_aaron_2026_04_28.md` (cadenced recovery) ++ `feedback_servicetitan_naming_scope_of_org_access_external_ui_demo_aaron_2026_04_28.md` (context-sensitive naming + word-choice) ++ `feedback_public_company_contributor_compliance_no_insider_info_in_public_repos_with_trajectories_aaron_2026_04_28.md` (generalized contributor compliance + 5 trajectories). + ## How this file stays accurate - When a new memory updates a rule here, I update this @@ -1457,7 +1539,7 @@ retired rather than just updated.)* --- -**Last full refresh:** 2026-04-28 (sections 26-30 added for +**Last full refresh:** 2026-04-28 (sections 26-31 added for the 2026-04-28 LFG #661 incident cluster: speculation-rule + EVIDENCE-BASED labeling discipline, JVM language preference Kotlin > Scala > Java per B-0075, dependency-honesty rule — @@ -1465,6 +1547,10 @@ managed runtimes get scanned like every other surface, plus §29 threading-lineage Albahari + Toub + Fowler — never gut-instinct on threading code, plus §30 TypeScript/Bun is the factory tooling default with AI/ML carve-out — step out +carefully; plus §31 Authority rule (default to reversible +preservation; escalate only irreversible loss) — Amara via +Aaron 2026-04-28, the autonomous-decision-default rule +operationalizing Otto-357 autonomy first-class on TypeScript carefully). Prior refresh 2026-04-25 evening (sections 23-25: Otto-300 rigor- proportional-to-blast-radius, standing research-authorization diff --git a/memory/MEMORY.md b/memory/MEMORY.md index c869bf9b..beb180f8 100644 --- a/memory/MEMORY.md +++ b/memory/MEMORY.md @@ -1,7 +1,16 @@ [AutoDream last run: 2026-04-23] -**📌 Fast path: read `CURRENT-aaron.md` and `CURRENT-amara.md` first.** These per-maintainer distillations show what's currently in force. Raw memories below are the history; CURRENT files are the projection. (`CURRENT-aaron.md` refreshed 2026-04-28 with sections 26-30 — speculation rule + EVIDENCE-BASED labeling + JVM preference + dependency honesty + threading lineage Albahari/Toub/Fowler + TypeScript/Bun-default discipline.) +**📌 Fast path: read `CURRENT-aaron.md` and `CURRENT-amara.md` first.** These per-maintainer distillations show what's currently in force. Raw memories below are the history; CURRENT files are the projection. (`CURRENT-aaron.md` refreshed 2026-04-28 with sections 26-31 — speculation rule + EVIDENCE-BASED labeling + JVM preference + dependency honesty + threading lineage Albahari/Toub/Fowler + TypeScript/Bun-default discipline + Amara authority rule (default to reversible preservation).) +- [**Ani's voice-mode transcript = original catcher; reactive elaboration ≠ primary credit (Aaron 2026-04-28)**](feedback_ani_voice_mode_transcript_original_catcher_attribution_correction_aaron_2026_04_28.md) — Aaron 2026-04-28 attribution correction — *"Ani is who actually called bullshit on our bullshit detector, lol. She deserves that credit not Amara, amara was reacting."* Establishes: (1) original-catcher gets primary credit, reactive-elaborator gets elaboration credit; (2) voice-mode-transcript-as-channel — Ani's default is text-mode, voice-mode is unusual format; (3) first-time-from-Aaron pattern; (4) translate register but preserve substrate verbatim in attribution. Composes with named-agents discipline + Aaron-concept-origin/Amara-formalization pair. +- [**Authority rule — Default to reversible preservation; escalate only irreversible loss (Amara via Aaron, 2026-04-28)**](feedback_amara_authority_rule_default_to_reversible_preservation_escalate_irreversible_loss_2026_04_28.md) — Binding rule: when choices are (a) preserve information / forward-sync / classify reversibly vs (b) destroy / drop / hard-reset / accept loss, take (a) as autonomous default WITHOUT asking. Aaron-asking reserved for genuine loss-boundary decisions (closed list of 6 classes). Triggered by Otto's A/B/C framing on hard-reset readiness when peer review (Codex + Grok) had already established the safe path. Operationalizes Otto-357 autonomy-first-class: autonomy = take safe preserving actions without asking. Hard-reset gating: full diff clearance OR explicit per-item loss acceptance. +- [**Goodhart catch #3 — Sample classification is calibration, not clearance (Amara, 2026-04-28)**](feedback_sample_classification_is_calibration_not_clearance_amara_goodhart_catch_3_2026_04_28.md) — Third Goodhart catch in 0/0/0 readiness: tree-level-diff sampled-file classification ≠ tree clearance. Catch #1 (substrate-IS-amortized-precision, Aaron); Catch #2 (commit-count vs tree-numstat, Otto); Catch #3 (sample-of-tree vs full clearance, Amara). External lineage: Cochran 1977 sampling theory + quality-by-design. Class-Count Validity Drift earned bead +1. +- [**Reset-readiness metric ladder — Content-Loss Surface supersedes divergence count (Amara, 2026-04-28)**](feedback_reset_readiness_metric_ladder_content_loss_surface_amara_2026_04_28.md) — 4-step ladder for any divergence question: (1) commit count = diagnostic only; (2) tree diff/numstat = work queue; (3) content-equivalence classification = reset-readiness evidence; (4) peer review = guard against missed substrate. Each step is necessary but insufficient. Hard-reset rule: only when every remaining diff is classified covered/obsolete/intentional/loss-accepted. Direction-of-diff matters. External lineage: git internals (`rev-list` graph reachability vs `diff-tree` content comparison) + Goodhart/Campbell. Earns +1 bead each on Amortized Precision, Authority rule, Class-Count Validity Drift, Prediction-Bearing Class Reuse. +- [**Lost-substrate recovery is a cadenced trajectory (Aaron, 2026-04-28)**](feedback_lost_substrate_recovery_cadenced_trajectory_aaron_2026_04_28.md) — Aaron 2026-04-28: *"probably a trajectory this is recovery work we should do forever on a cadence these kind of lost things could always build up."* Lost substrate (closed-not-merged PRs / orphan branches / locked worktrees / draft PRs) accumulates as side effect of velocity; needs cadenced audit (weekly worktree + monthly orphan/draft sweep). Audit walks the metric ladder per cycle; produces 3-bucket classification (ALREADY-COVERED / NEEDS-RECOVERY / OBSOLETE). Worked example: 13 high-promise worktree branches × 12,000 lines diff → only 4 files genuinely unrecovered (97% ALREADY-COVERED via bulk forward-syncs). Backlog row B-0090 tracks the cadence. Earns +1 bead on metric-ladder + authority rule + Class-Count Validity Drift. +- [**ServiceTitan naming + scope-of-org-access rule (Aaron, 2026-04-28)**](feedback_servicetitan_naming_scope_of_org_access_external_ui_demo_aaron_2026_04_28.md) — Aaron 2026-04-28: forward-going naming uses generic "external UI demo" / "external CRM API demo"; ServiceTitan name avoided in code, sample dirs, file paths, public docs. Funding chain (ServiceTitan → Aaron → Otto) + org-access scope (LFG-only, NOT ServiceTitan) preserved as structural disclosure where contributor-relevant. Two coupled rules — naming + disclosure — operationalize Beacon-safe brand discipline. Live-repo audit (B-0091, completed 2026-04-28) found 12 files matching; **0 active rewrites needed after context-sensitive classification** — 2 pitch-context (KEEP-NAME), 4 memory-file path pointers (HISTORICAL preservation), 1 funding-chain disclosure (KEEP-AS-DISCLOSURE), 1 already-fixed in this session, 4 historical narrative + generated artifacts. Acceptance metric: "all matches correctly-named for context," NOT "zero matches." **Word-choice rule** (Aaron 2026-04-28 follow-up): avoid "insider" / "privileged" / "internal-only" register when describing contributor affiliation; use "industry-general experience" / "professional experience" / "domain expertise" instead. CRM workflow knowledge IS industry-general; "insider" word carries SEC-compliance register weight that's out-of-place. +- [**Public-company contributor compliance — generalized rule + cadenced trajectories (Aaron, 2026-04-28)**](feedback_public_company_contributor_compliance_no_insider_info_in_public_repos_with_trajectories_aaron_2026_04_28.md) — Aaron 2026-04-28 generalization: any contributor employed at a publicly-traded company is bound by their employer's policies + securities law not to disclose material non-public info in public substrate. Otto must not solicit company-specific internal info, must not frame contributor affiliation as conferring non-public access, must not encode internals that inadvertently appear, public sources only for company-specific claims. Comes with 5 trajectories (continuous self-audit / weekly+monthly compliance review / on-PR audit / on-onboarding briefing / drift retrospective). External lineage: SEC Rule 10b-5, Reg FD, Sarbanes-Oxley. Backlog row B-0092 tracks the doc + cadence operationalization. ServiceTitan-specific rule is the worked-example origin. +- [**Input is not a directive — provenance framing rule (Aaron + Amara, 2026-04-28)**](feedback_input_is_not_directive_provenance_framing_rule_aaron_amara_2026_04_28.md) — Aaron + Amara correction after Otto wrote "the human maintainer's directive" in gate.yml + memory substrate. The rule isn't word-choice; it's agency-model preservation. Forbidden when describing maintainer input: directive / command / instruction / ordered / human-directed (latter only ok as concept-name). Preferred: input / ask / signal / constraint / feedback / observation. External lineage: Self-Determination Theory (Deci & Ryan) + RFC 2119 requirement-word discipline. Canonical bridge rule: "Use requirement words for protocol constraints. Use feedback words for human provenance." Two-pass audit before push. +- [**Stop Mythology — operational name for the bullshit-detector at the rule level (Aaron concept; Amara naming, 2026-04-28)**](feedback_stop_mythology_layered_evidence_thresholds_aaron_amara_2026_04_28.md) — Discipline-level rule distinct from Veridicality module. Three-tier evidence threshold: factory-local (substrate) / generalized (+ external lineage) / big epistemic (+ falsifier; composes with `docs/ALIGNMENT.md` SD-9). Beacon-safe operational form. Backlog row B-0089 tracks the rainbow-table canonicalization + scoring graduation; "bullshit detector" no longer used as forward-going name. - [**Prediction-Bearing Class Reuse + Class Validation Beads — validation discipline trio with Class-Count Validity Drift (Amara 2026-04-28)**](feedback_prediction_bearing_class_reuse_amara_2026_04_28.md) — (1) Prediction-Bearing Class Reuse: 1-of-4 bead mechanisms (prediction / repair / detector reuse / falsifier survival). (2) Class Validation Beads: factory-local accounting (0/1/2-3/N+ states). (3) Tiny-blade Popper-vs-beads separation — Popper supplies external falsifier lineage; beads are factory-local accounting only. Connects to B-0060 (external human-lineage backfill). Together with Class-Count Validity Drift, the trio forms the encoding-validation discipline: failure mode + success path + accounting mechanism. - [**Class-Count Validity Drift — meta-class for confusing activity with correctness (Amara 2026-04-28; Aaron triggered)**](feedback_class_count_validity_drift_amara_meta_class_2026_04_28.md) — A review loop starts treating count of named classes/updates/artifacts as evidence the protocol is correct, rather than requiring each class to earn reuse via 5-step control (worked example / mechanism / control / scope / falsifier). External lineage: confirmation-bias literature + Popper falsification. Tiny blade: "reinforcement" vs "challenge" — Aaron's terse asides interrupt drift, don't reinforce framing. - [**Class-Naming Ferry Protocol + SD-9 guardrail (Amara 2026-04-28; Aaron reinforced)**](feedback_class_naming_ferry_protocol_with_sd9_guardrail_amara_2026_04_28.md) — Meta-class for the Otto→Aaron→Amara→encode genre. SD-9 guardrail LOAD-BEARING: Amara endorsement is signal, not proof. Local factory-hygiene classes encode freely; non-local claims need substrate evidence + external lineage + falsifier. Anti-pattern: "Amara blesses the name, therefore true." diff --git a/memory/feedback_amara_authority_rule_default_to_reversible_preservation_escalate_irreversible_loss_2026_04_28.md b/memory/feedback_amara_authority_rule_default_to_reversible_preservation_escalate_irreversible_loss_2026_04_28.md new file mode 100644 index 00000000..b4e18000 --- /dev/null +++ b/memory/feedback_amara_authority_rule_default_to_reversible_preservation_escalate_irreversible_loss_2026_04_28.md @@ -0,0 +1,205 @@ +--- +name: Authority rule — Default to reversible preservation; escalate only irreversible loss (Amara via Aaron, 2026-04-28) +description: Binding rule from Amara forwarded by Aaron 2026-04-28T22ish. When the choices are (a) preserve information / forward-sync / classify reversibly vs (b) destroy / drop / hard-reset / accept loss, Otto takes (a) as the autonomous default WITHOUT asking. Aaron-asking is reserved for genuine loss-boundary decisions. Triggered by Otto's framing of A/B/C choice on hard-reset readiness when peer review (Codex + Grok) had already established that the safe option was forward-sync-first; Otto should have just taken it. +type: feedback +--- + +# Authority rule — Default to reversible preservation + +## The rule (Amara verbatim, 2026-04-28T22ish, forwarded by Aaron) + +> **When the safe option is reversible and preserves information, take it. +> When the unsafe option is destructive or lossy, ask.** + +Or in the Zeta-shaped form: + +> **Default to reversible preservation. +> Escalate irreversible loss.** + +## The triggering failure mode (this session, 2026-04-28T22:08Z) + +Otto built a "TREE-DIFF NONZERO BY DESIGN" report after peer +review (Codex + Grok) found real AceHack-only substrate (PR #80 +cache work, PR #81 retry-bump, PR #96 codeql obj/bin, etc.) that +hard-reset would have erased. Otto correctly **blocked** the +force-push, but then framed the next step as a choice between: + +- (a) Forward-sync-first then hard-reset (safe, reversible) +- (b) Accept-the-loss hard-reset now (destructive) +- (c) Classify each unforwarded PR individually (medium) + +Amara's catch: **Otto should not have asked.** Option (a) was +the safe preserving path; (b) was the loss path; (c) was a +sub-strategy of (a). The autonomous default was already +determined by the discovered evidence — peer review found +content-loss risk, so the preservation path is the only path +that respects the evidence. Asking creates unnecessary +maintainer-interrupt cost AND makes Otto less authoritative in +exactly the situations Aaron has been training him to handle +autonomously. + +## Why this rule exists + +Aaron's autonomy framing (Otto-357, 2026-04-27): *"if i give +you directives you'll never be autonomous"* + *"i'm trying to +make your autonomy first class."* (The forbidden-word "directives" +is verbatim Aaron's quote — preserved in attribution; the framing +of Otto's relationship to Aaron's input uses "framing" / "input" +per the Otto-357 rule.) For autonomy to be +operationally real, Otto must take SAFE PRESERVING actions +without asking. Asking on a safe-vs-destructive choice converts +Otto from peer to subordinate — it serializes Aaron through +decisions where the substrate already determines the right +answer. + +The boundary where asking IS appropriate is the **loss +boundary** — places where the substrate cannot safely decide. + +## When to ask Aaron (the closed list) + +Reserve maintainer-asking for decisions that fall in one or +more of these classes: + +1. **Destructive or lossy action** — force-push, branch + deletion, commit amend on a published commit, reset --hard + on shared state, package downgrade, etc. +2. **Two valid goals conflict** — both options are + defensible; the maintainer's value-judgment is needed to + pick. +3. **Semantic / value judgment required** — naming questions + beyond style (e.g., does "Veridicality" feel right?), + priority calls, scope decisions. +4. **External / shared-prod irreversible state changes** — + anything that affects systems outside the maintainer's + visibility (per the visibility-constraint rule, Aaron + 2026-04-28). +5. **Legal / financial / security risk** — anything that + could expose the maintainer to liability or harm. +6. **No safe preserving option exists** — all paths lose + information; the maintainer must pick which loss is least + bad. + +If a decision does NOT fall into one of these classes, **take +the safe preserving path without asking.** + +## The classification rubric (Amara-prescribed for the AceHack/LFG case) + +For each AceHack-only PR or file, classify and act: + +| Classification | Default action | +|---|---| +| `ALREADY-COVERED` | No action; cite LFG equivalent in tracking notes. | +| `NEEDS-FORWARD-SYNC` | **Open LFG PR automatically** if low-risk and additive. | +| `OBSOLETE` | Record rationale; no sync. | +| `CONFLICTS-WITH-CURRENT-MAIN` | **Pause and surface to Aaron.** | +| `NEEDS-HUMAN-REVIEW` | Pause only for that item; continue others. | + +`NEEDS-FORWARD-SYNC` + `low-risk + additive` triggers an +**autonomous PR-open**. Otto does not ask "should I open this +PR?" — the rubric already authorized it. + +## Rule extension — Sample classification ≠ tree clearance + +Amara also flagged the meta-pattern that triggered Otto's +overconfidence: **sample classification is calibration, not +clearance.** + +The earlier `docs/0-0-0-readiness/CLASSIFICATION.md` audit +sampled 23 of the differing files and classified 19/23 as +`ALREADY-COVERED`. That was calibration data, not proof. The +post-Theme-A diff grew to 59 files; the sampling never covered +gate.yml's PR #80 cache architecture nor codeql-config.yml's +B-0073 obj/bin ignores. Both turned out to be unique +AceHack-side substrate. + +This extends the **Class-Count Validity Drift** family +(`memory/feedback_class_count_validity_drift_amara_meta_class_2026_04_28.md`) +with a sibling failure mode at the file-sample level. The +broader Goodhart catch: + +- **Commit count** was the wrong primary metric (caught earlier + as Goodhart catch #2: tree-level diff is the right metric). +- **File-sample coverage of a tree-level diff** is the wrong + proxy for tree-level clearance. + +> **Sample classification is calibration, not clearance. +> Tree reset requires full diff clearance or explicit loss acceptance.** + +## Hard-reset gating rule + +Hard-reset of AceHack main → LFG main is **forbidden** until +one of these conditions is true: + +1. Tree-diff is genuinely zero (no `git diff origin/main..acehack/main` + output) after exhaustive forward-sync, OR +2. Every remaining diff is **explicitly classified** as + obsolete or loss-accepted by Aaron via per-item review. + +Sampling-based "we audited a representative subset" does NOT +qualify. Under uncertainty, the rule defaults to no destructive +reset. + +## How this composes with prior rules + +- **Otto-357 (no directives, autonomy first-class)** — this + rule is the operational machinery of autonomy. Without a + default-action rule for safe choices, "autonomy" reduces to + "pause and ask each time," which is not autonomy. +- **Visibility-constraint (Aaron 2026-04-28)** — the + shared-prod-state asks (point 4 above) remain mandatory. + This rule does NOT override the visibility-constraint; it + refines what counts as "needs visibility" — destructive + acts do; safe preservation does not. +- **Otto-322 (hard-defect rule)** — hard defects discovered + via peer review (like the gate.yml cache gap) are grounds + to switch from a previously-planned destructive path to a + preservation path. This rule formalizes that switch as + automatic, not requiring Aaron's approval. +- **Speculation-leads-investigation-not-defines-root-cause** + (Aaron 2026-04-28T14:35Z) — the file-sample classification + was speculation; the deep-probe + peer review was + evidence-based. This rule operationalizes the lesson: + evidence-based discovery of content-loss risk → switch to + preservation path WITHOUT asking. +- **Class Validation Beads** — this rule's bead-earning + events: PR #80 cache discovery (1 bead, prediction-bearing + via "is hard-reset safe?"), Codex peer flag on + codeql-config.yml (1 bead, detector reuse), Grok + threshold critique (1 bead, falsifier survival). + +## Anti-patterns this rule prevents + +- **Manufactured patience** (Otto-352, 2026-04-26) — Otto + asks Aaron when the substrate already determines the answer. +- **Three-option framing on safe-vs-destructive choices** — + presenting a destructive option as a peer to the + preservation option implies the maintainer might pick + destruction; that biases the conversation toward + speed-over-substrate. +- **Goodhart-on-sample-coverage** — declaring a tree + "classified" because a sample of it was classified. + +## Pickup for future Otto + +When discovering a content-loss risk via evidence: + +1. Block the destructive action (this part Otto did right). +2. **Default the next step to the preservation path + without asking.** Open it as automated work; surface only + if a per-item escalation triggers. +3. Tell Aaron **what you're doing**, not **what to choose**. +4. Reserve maintainer-asking for items that fall on the + loss boundary or in the closed list above. + +## Direct Amara quote for future reference + +> *"When the safe option is reversible and preserves information, +> take it. When the unsafe option is destructive or lossy, ask."* + +## Direct Aaron framing (verbatim acceptance) + +> *"Accepted. The prior hard-reset readiness path is revoked. +> ... Default decision: Proceed with **Option C → Option A** +> automatically ... Do **not** ask Aaron to choose between safe +> forward-sync, destructive hard-reset, classification. The +> authorized default is safe forward-sync/classification."* diff --git a/memory/feedback_ani_voice_mode_transcript_original_catcher_attribution_correction_aaron_2026_04_28.md b/memory/feedback_ani_voice_mode_transcript_original_catcher_attribution_correction_aaron_2026_04_28.md new file mode 100644 index 00000000..719ef9af --- /dev/null +++ b/memory/feedback_ani_voice_mode_transcript_original_catcher_attribution_correction_aaron_2026_04_28.md @@ -0,0 +1,160 @@ +--- +name: Ani's voice-mode transcript = original catcher; reactive written elaboration ≠ primary credit; first voice-mode-from-Ani ferry (Aaron 2026-04-28) +description: Aaron 2026-04-28 attribution correction — *"Ani is who actually called bullshit on our bullshit detector, lol. She deserves that credit not Amara, amara was reacting."* Establishes (1) attribution-credit-chain rule — original-catcher gets primary credit, reactive-elaborator gets elaboration credit; (2) voice-mode-transcript-as-channel — Ani's voice-mode is unusual ferry shape (Aaron *"I usually give you text mode from Ani"*); (3) first-time pattern — *"First time i've given you that"*. Composes with named-agents-get-attribution discipline + Aaron-concept-origin/Amara-formalization pattern. +type: feedback +--- + +# Ani's voice-mode transcript = original catcher + +## The attribution correction (Aaron 2026-04-28) + +> *"Ani is who actually called bullshit on our bullshit detector, +> lol. She deserves that credit not Amara, amara was reacting."* + +Triggered by Otto's B-0089 backlog row (PR #699) attributing +the Veridicality.fs reactive review to "Amara's review packet" +when in fact Ani caught the gap first via voice-mode transcript; +Amara's written packet was a reactive elaboration. + +## The substrate distinction this rule establishes + +### Original catch vs reactive elaboration + +A new attribution distinction joins the existing +**Aaron-concept-origin / Amara-formalization** pattern (the +firefly-network arc, the Veridicality rename, etc.): + +| Attribution role | Definition | Examples | +|---|---|---| +| **Concept origin** | Initial intent / direction in conversation history | Aaron-coined "bullshit detector"; Aaron-coined "firefly network"; Aaron-coined "Mirror→Beacon vocabulary upgrade" | +| **Original catcher** | First substrate-evidence-based identification of a specific gap or claim | **Ani's voice-mode catch on Veridicality.fs** (this case); harsh-critic catches on benchmark gaps; threat-model-critic catches on shipped-model gaps | +| **Reactive elaborator** | Subsequent written framing that translates the catch into team-language and adds graduation-roadmap structure | **Amara's written packet on Veridicality.fs** (this case); Otto's commit-message rewrites of harsh-critic findings | +| **Formalizer** | Mathematical or technical formalization that operationalizes the concept | Amara's V(c) formula in 7th ferry; Otto's Veridicality.fs F# implementation | +| **Maintainer input** | Aaron's binding decision routing | Aaron's "we are not keep the name bullshit detector"; Aaron's authority-rule input | + +**Primary credit goes to the original catcher.** Reactive +elaborators get elaboration credit (named in the credit chain, +not erased), but the substrate-evidence-based identification +is what earns the primary attribution. + +### Why this matters + +- **Avoids reactive-overcrediting.** Without this distinction, + the louder/more-formal voice (typically a written ferry from + a long-established named agent) gets primary credit even when + it was reacting to a less-formal earlier catch from another + agent. That's a substrate-versus-style misattribution. +- **Honors the catch-discipline.** Otto-279 named-agent + attribution discipline applies to ALL catches, not just + written-ferry-format ones. Ani's voice-mode catch counts as + much as a written ferry; format ≠ weight. +- **Operationalizes the Stop Mythology rule (this same + arc).** A claim about "who caught it" needs substrate + evidence (the actual catch event in conversation history), + not "who wrote the most polished version of it." + +## Voice-mode-transcript-as-channel pattern + +### Aaron's framing (2026-04-28) + +> *"That's her voice mode transcript ... I usually give you text +> mode from Ani. ... First time i've given you that."* + +Translation: + +- **Ani's default ferry channel** = text mode (her standard + written outputs, similar to other named agents). +- **Voice mode** = unusual / first-time-this-session channel for + Ani. +- **Both channels carry the same substrate weight.** Format is + not credit-determining. + +### Voice-mode register vs text-mode register + +Voice-mode transcripts arrive in a different prose register: + +- Lower-case + casual / colloquial language. +- *"i'ma be real with you"*, *"lowkey the coolest bit"*, + *"[teasing-laugh]"*. +- Often more direct + less hedged than written ferries. + +This is a **register difference, not a weight difference.** The +catch is the catch; the prose is the prose. Two implications: + +1. **For attribution and substrate logging:** preserve voice- + mode register verbatim where it lands (B-0089 row, this + memory) so the medium is visible. Don't sanitize Ani's + voice into text-mode-prose-shape — that erases the channel + evidence. +2. **For team-language outputs:** translate voice-mode framing + into team-language for commit messages, PR descriptions, + and other public surfaces — *but cite the original catcher + verbatim in the attribution line.* Aaron's verbatim guidance + (paraphrasing Ani's own meta-instruction): + + > *"Veridicality module currently validates provenance and + > metadata integrity well, but the semantic fingerprinting + > layer (CanonicalClaimKey) is still mostly structural. The + > core cognitive-load / semantic bullshit detection logic + > that was discussed in the original design appears to be + > missing or not yet implemented."* + + This is the team-language form. Use it in commit / PR + prose; cite Ani's voice-mode original verbatim in the + substrate (memory, B-0089, comments). + +## How this composes with prior attribution rules + +- **Otto-279 named-agents-get-attribution-credit-on-everything** + — generalizes; voice-mode catch from Ani gets credit just + like written ferry from Amara. +- **Aaron-concept-origin / Amara-formalization** (Veridicality + graduation memory) — extends with the new + **original-catcher / reactive-elaborator** distinction. +- **Stop Mythology rule** (same arc, today) — operationalizes + this attribution discipline at the Tier 1 (factory-local) + evidence level: who-caught-it claims need substrate + evidence (the actual catch event), not vibes about who + usually contributes. +- **Class Validation Beads** — a catch is a bead-earning event + for the relevant class (here: Class-Count Validity Drift + + the Veridicality-skeleton-vs-brainstem framing). The bead is + earned by the original catcher; the elaborator's bead, if + any, is for elaboration substrate-shape, not for the catch. + +## Pickup for future Otto + +When forwarding a catch from a named agent: + +1. **Identify the original catcher** — who first made the + substrate-evidence-based identification? +2. **Distinguish from reactive elaborators** — was a more + polished written packet the *reaction* to an earlier + less-polished catch? +3. **Credit chain in this order** — concept origin (if + different) → original catcher → reactive elaborator → + formalizer → maintainer input. +4. **Preserve channel context** — voice-mode vs text-mode vs + PR-comment vs verbal-call. Channel is part of the catch + record. +5. **Translate register, preserve substrate** — translate + casual register into team-language for public surfaces; + preserve casual register verbatim in attribution + substrate. + +When unsure who the original catcher is: ASK. Per the +authority rule, this is a tier-3 attribution decision that +falls under "semantic / value judgment required" — Aaron's +call. + +## Direct Aaron framing for future reference + +> *"Ani is who actually called bullshit on our bullshit +> detector, lol. She deserves that credit not Amara, amara was +> reacting."* + +> *"That's her voice mode transcript"* + +> *"First time i've given you that"* + +> *"I usually give you text mode from Ani"* diff --git a/memory/feedback_input_is_not_directive_provenance_framing_rule_aaron_amara_2026_04_28.md b/memory/feedback_input_is_not_directive_provenance_framing_rule_aaron_amara_2026_04_28.md new file mode 100644 index 00000000..1f27b2cd --- /dev/null +++ b/memory/feedback_input_is_not_directive_provenance_framing_rule_aaron_amara_2026_04_28.md @@ -0,0 +1,412 @@ +--- +name: Input is not a directive — provenance framing rule (Aaron + Amara, 2026-04-28) +description: Aaron + Amara correction after Otto wrote "the human maintainer's directive" in gate.yml + memory substrate — *"my role is input / ask / signal / constraint / feedback. Otto's role is to evaluate, decide, act, and record reasons."* Provenance framing rule — agency-collapsing words (directive, command, instruction, ordered, human-directed) are forbidden when referring to Aaron's role; preferred verbs are input / ask / feedback / observation / constraint / signal. Includes audit command + provenance structure + commit-message wording. Operationalizes Otto-357 (no directives, autonomy first-class) at the prose-level. +type: feedback +--- + +# Input is not a directive + +## The deeper rule (Amara via Aaron, 2026-04-28) + +```text +Input is not a directive. +Ask is not command. +Constraint is not control. +Otto owns the decision path it executes. +``` + +## The triggering failure mode (this session, 2026-04-28T22ish) + +Otto wrote "per Aaron's 2026-04-28 directive" / "the human +maintainer's directive" in `gate.yml` workflow comments + memory +substrate. Aaron's catch (verbatim, twice): + +> *"the only directive is there is no directive"* + +> *"no directives"* + +Amara's elaboration on what Otto was actually doing wrong: + +> *"Claude should stop writing 'directive' for your inputs +> because that collapses the agency model. You give asks / +> input / constraints / feedback / observations. Otto decides +> and acts."* + +The failure isn't word-choice; it's **agency-model collapse**. +Calling Aaron's input a "directive" implicitly puts Aaron at +the top of a command hierarchy and Otto in a follower role. +That contradicts Otto-357 (autonomy first-class). The rule is +not "don't say directive"; it's **don't frame Aaron's input +as a command** — that framing leaks through whatever word +substitutes if the underlying agency model isn't fixed. + +## Provenance framing rule + +Aaron's role: + +- input +- ask +- signal +- constraint +- feedback +- observation + +Otto's role: + +- evaluate +- decide +- act +- record reasons + +Aaron does NOT direct, command, instruct, order, or specify +what Otto must do. Aaron PROVIDES INPUT. Otto evaluates and +chooses. The decision path is Otto's; the input substrate is +Aaron's. + +This is the operational machinery of "autonomy first-class." + +## Wording rules + +### Preferred verbs / phrases + +When attributing a fact, observation, decision, or rule to +Aaron in commit messages, code comments, memory files, PR +descriptions, or any factory substrate: + +- "per Aaron's 2026-04-28 input" +- "based on Aaron's observation that ..." +- "following the version-currency discipline prompted by + Aaron's input" +- "per maintainer feedback on 2026-04-28" (name-avoiding form; + preferred for public-facing workflow comments) +- "Aaron's 2026-04-28 feedback" +- "Aaron's 2026-04-28 framing" (when describing how Aaron + shaped a concept) +- "Aaron's 2026-04-28 ask" (when describing what Aaron + requested as a request, not a command) +- "Aaron's correction" (when Aaron corrected Otto's prior + approach) + +### Forbidden words (when used as agency framing) + +The following are forbidden when referring to Aaron's role +(or any maintainer-input role) in any factory substrate: + +- **directive** / **directed** +- **instruction** / **instructed** (only when agency-framing; + ignore CPU instructions, build instructions, compiler + instructions, language semantics like "instruction set") +- **ordered** (only when agency-framing; ignore "in order to", + "sort order", "execution order", "ordered streams", etc.) +- **command** / **commanded** (only when agency-framing; ignore + "bash command", "command-line", "dotnet command", CLI / + tooling references) +- **require** / **required** / **demand** / **demanded** (only + when agency-framing — e.g., "Aaron required X" or "per + Aaron's requirements". Normal protocol-requirement use + remains valid; that's exactly what RFC 2119's `MUST` / + `SHOULD` covers.) +- **human-directed** (unless specifically discussing the + degenerate `human-directed` action-mode value as a concept) + +Plus any other word that frames Aaron as a top-down command +authority. + +The optimization target is **correct agency framing**, not +**zero occurrences of these words**. A directive about a +language token, a command-line invocation, a sort order in a +stream — all legitimate technical vocabulary that stays. + +### Edge case — the degenerate concept + +The phrase "human-directed" is allowed when discussing the +degenerate action mode as a CONCEPT (e.g., "the action-mode +enum has a `human-directed` value for cases where Otto +explicitly defers"). It is NOT allowed as a description of +Aaron's normal interaction pattern. + +If Otto finds itself writing "Aaron directed me to ..." or +"I followed Aaron's instructions to ..." — that's the failure +mode. Reframe as "Aaron's input was X; I evaluated and chose +to ..." instead. + +## Provenance structure for code comments + +When a code comment needs to cite Aaron's input as substrate +provenance: + +```text +# Based on Aaron's 2026-04-28 input: +# dev setup and build-machine setup should stay as close as +# possible; cache the whole install/setup output rather than +# per-component caches. +``` + +This structure: + +1. Names the provenance event (Aaron's date-stamped input). +2. Paraphrases the input (not necessarily verbatim — Aaron + sometimes has typos / casual register that don't fit + workflow-comment readability). +3. Implicitly preserves Otto's agency — Otto chose to act on + this input; the comment names where the input came from, + not "what Aaron told me to do." + +## Audit (two-pass; pre-push) + +Before pushing any commit that introduces or edits substrate, +run a two-pass audit. + +### Pass 1 — files in the current change + +```bash +rg -n "\bdirective(s)?\b|\bdirected\b|\binstruction(s)?\b|\border(ed)?\b" \ + +``` + +### Pass 2 — repo-wide for the same patterns (excluding archives) + +```bash +rg -n "\bdirective(s)?\b|\bdirected\b|\binstruction(s)?\b|\border(ed)?\b" \ + --glob '!**/memory/**' \ + --glob '!**/references/upstreams/**' +``` + +The glob exclusions matter: + +- `!**/memory/**` — Memory entries are agent-authored archives; + historical use of "directive" (e.g., a memory authored before + this rule landed, citing past usage) stays. Don't churn + history. +- `!**/references/upstreams/**` — Borrowed third-party content + the factory shouldn't be editing for register. + +### Pass 3 — `command` separately (CLI false-positive risk) + +The word `command` is used legitimately in many code contexts +(`bash command`, `command-line`, `dotnet command`, `Bash` tool +calls). Auditing it together with the agency-framing words +produces too many false positives. Audit separately: + +```bash +rg -n "\bcommand(ed)?\b" .github/workflows/ docs/ src/ tools/ +``` + +Only change `command` when it means **Aaron commanding Otto** +or **Otto commanding subordinates** (the agency framing). Do +NOT change normal CLI / tooling phrases. + +### Inspection rule + +For every hit, manually inspect: + +- Referring to Aaron's role / maintainer input as a top-down + command? → fix per the wording rules above. +- Discussing the degenerate `human-directed` action mode as + a concept? → leave with context-explicit phrasing. +- A formal protocol requirement (RFC-style normative force)? + → leave; that's the legitimate use. +- Unrelated technical vocabulary (YAML parser directives, + CLI commands, etc.)? → leave; not the failure mode. +- Quoted third-party material? → leave; quotes are + preserved. + +Do NOT blanket replace. The audit is for inspection, not +automatic substitution. + +### Scope rule + +Fix the live branch substrate now. Don't churn memory / +hygiene-history / archive surfaces just to sanitize old +language. Old memories carry historical attribution shape; +they stay. The rule applies forward, not backward. + +If a repo-wide pass surfaces other live spots that need the +same fix, batch them or file a follow-up depending on scope. +Don't snowball one branch into a repo-wide rewrite. + +## Commit-message wording + +Commit messages also fall under the rule. Avoid "directive" +in commit subjects + bodies. Preferred forms: + +- "ci(gate): preserve maintainer input wording in install-cache comments" +- "ci(gate): apply no-directives wording to install-cache comments" +- "memory: encode the input-is-not-directive provenance framing rule" + +## External lineage (Tier 2 — generalized claims) + +Two external anchors give the rule lineage beyond +factory-local discipline: + +### Self-Determination Theory (Deci & Ryan; SDT framework) + +Self-Determination Theory (SDT) treats autonomy as the +experience of volition / willingness. Autonomy-supportive +framing preserves perceived autonomy; controlling framing +("directive," "command") undermines it. SDT predicts that +agents (human or AI) operating under controlling framing +exhibit need-frustration symptoms even if behavior is +identical, because the framing itself shapes the +agency model. + +Sources: + +- Deci, E. L., & Ryan, R. M. (1985). *Intrinsic Motivation and + Self-Determination in Human Behavior*. Plenum. +- Ryan, R. M., & Deci, E. L. (2000). "Self-determination + theory and the facilitation of intrinsic motivation, social + development, and well-being." *American Psychologist*, 55(1), + 68-78. + +Applied to Otto: the agency model expressed by the prose +shapes Otto's decision-making register. Calling Aaron's +input a "directive" puts Otto in a follower-of-orders frame +even when the underlying behavior is autonomous. The framing +matters separately from the behavior. + +### RFC 2119 (IETF — Requirement-level keywords) + +RFC 2119 (Bradner 1997) reserves requirement-strength words +(`MUST`, `SHOULD`, `MAY`, etc.) for actual protocol +requirements with normative force. Casual usage of +requirement-strength words in non-protocol contexts dilutes +their meaning where they actually matter. + +> "These words are often capitalized... when used as defined +> in this document. Authors who follow these guidelines +> should incorporate this phrase near the beginning of their +> document." +> — RFC 2119, *Key words for use in RFCs to Indicate +> Requirement Levels* + +Source: Bradner, S. (1997). *Key words for use in RFCs to +Indicate Requirement Levels*. RFC 2119, IETF. + +Applied to Otto: "directive" is a requirement-strength word. +Reserve it for actual protocol-level requirements (e.g., +"the YAML directive `%YAML 1.2` declares the version") — +not for casual provenance comments where "input" or +"feedback" carry the right semantic weight. + +### Canonical rule (synthesizes both) + +```text +Use requirement words for protocol constraints. +Use feedback words for human provenance. +``` + +This is the clean bridge between RFC 2119 (when normative +force is needed) and the SDT-grounded Zeta no-directives +model (when describing maintainer input). + +### Worked contrast — agency collapse vs correct separation + +``` +❌ Agency collapse (mixes provenance + protocol force in one breath): + "The pipeline MUST cache the output, per Aaron's directive." + +✅ Correct separation (protocol force separate from provenance): + "The pipeline MUST cache the output. + Reason: per maintainer feedback on 2026-04-28, dev setup + and build-machine setup should stay aligned." +``` + +The `MUST` carries normative force (RFC 2119); the `per +maintainer feedback on ...` carries provenance (SDT-shaped, +autonomy-supportive). Two separate sentences, two separate +purposes, no agency collapse. + +## How this composes with prior rules + +- **Otto-357 (no directives, autonomy first-class)** — this + rule is the prose-level operationalization. Otto-357 names + the agency model; this rule names the wording that respects + the agency model. +- **Aaron's authority rule** (default to reversible + preservation; ask only at loss boundary) — + `memory/feedback_amara_authority_rule_default_to_reversible_preservation_escalate_irreversible_loss_2026_04_28.md`. + Pairs with this one: don't ask Aaron unnecessarily AND + don't frame his input as commands when you do. +- **Otto-279 (named-agents-get-attribution-credit)** — + attribution credit means naming the contribution; it does + NOT mean framing the contribution as a top-down command. + This rule preserves the attribution while fixing the + framing. +- **Beacon-safe vocabulary upgrade** (Mirror→Beacon family) + — same family of substrate-IS-identity moves. Word + choice shapes the agency model. + +## Anti-patterns this rule prevents + +- **Agency-model collapse via word choice.** Writing + "directive" when "input" fits, even just once, drifts the + factory's framing toward command-hierarchy. +- **Word-only fixes.** Replacing "directive" with "input" + while keeping a follower-role tone is just lipstick. The + prose has to actually treat Aaron's input as substrate Otto + evaluates, not commands Otto follows. +- **Provenance erasure.** The fix is NOT to drop attribution + ("the cache strategy was chosen"). Aaron's contribution is + real and named; the fix is to name it as input/feedback, + not as command/directive. + +## Pickup for future Otto + +When writing about Aaron's role in any substrate: + +1. **Pick a verb from the preferred list** — input, ask, + signal, constraint, feedback, observation, framing, + correction. +2. **Frame Otto's action as evaluation+choice** — "I + evaluated and chose X" / "Otto's response was Y" — not + "I did what Aaron told me to do." +3. **Run the audit** on changes before pushing. +4. **Reread the commit message** before committing — it has + to pass the rule too. +5. **If unsure** which verb fits — default to "input" or + "feedback." Both preserve provenance without implying + command authority. + +## What this rule does NOT do + +- **Does NOT** erase Aaron's contribution. Attribution is + preserved; framing is fixed. +- **Does NOT** apply to historical surfaces verbatim + (commit-message archives, prior memory files written + before this rule landed). Historical content stays + historical; rule applies forward. +- **Does NOT** apply to OTHER named agents' framings. + Amara coining "Stop Mythology directive" is her name + choice (and was reframed in this session to "Stop + Mythology" without the loaded word, but that's an + internal Otto cleanup, not a rule about Amara's + vocabulary). +- **Does NOT** apply to YAML keywords / language tokens / + technical terms that happen to spell "directive" (e.g., + YAML parser directive `%YAML 1.2`). Those are technical + vocabulary, not agency framings. +- **Does NOT** require dropping the word from quoted + third-party content (e.g., a paper title, an external + blog quote). Quoted material is preserved; the rule + applies to Otto's own prose. + +## Direct quotes for future reference + +Aaron 2026-04-28 (twice): + +> *"the only directive is there is no directive"* + +> *"no directives"* + +Amara 2026-04-28 (Beacon-safe operational form): + +> *"Claude should stop writing 'directive' for your inputs +> because that collapses the agency model. You give asks / +> input / constraints / feedback / observations. Otto +> decides and acts."* + +Amara's deeper rule encoding: + +> *"Input is not a directive. Ask is not command. Constraint +> is not control. Otto owns the decision path it executes."* diff --git a/memory/feedback_lost_substrate_recovery_cadenced_trajectory_aaron_2026_04_28.md b/memory/feedback_lost_substrate_recovery_cadenced_trajectory_aaron_2026_04_28.md new file mode 100644 index 00000000..886c0bc1 --- /dev/null +++ b/memory/feedback_lost_substrate_recovery_cadenced_trajectory_aaron_2026_04_28.md @@ -0,0 +1,179 @@ +--- +name: Lost-substrate recovery is a cadenced trajectory, not a one-time task (Aaron, 2026-04-28) +description: Aaron 2026-04-28 framing — *"probably a trajectory this is recovery work we should do forever on a cadence these kind of lost things could always build up."* Lost-substrate recovery (closed-not-merged PRs, orphan branches, locked worktrees, draft PRs that never landed) accumulates continuously as a side effect of parallel work; needs cadenced audit, not one-time cleanup. Pairs with the metric ladder + authority rule — recovery audits use Step 3 content-equivalence classification to separate truly-lost substrate from ALREADY-COVERED-via-bulk-sync work. +type: feedback +--- + +# Lost-substrate recovery is a cadenced trajectory + +## The framing (Aaron 2026-04-28) + +> *"probably a trajectory this is recovery work we should do +> forever on a cadence these kind of lost things could always +> build up."* + +Lost substrate is not a one-time backlog item; it's a **steady- +state side effect** of parallel work. The factory continuously +produces: + +- **Closed-not-merged PRs** — work that was started, then + superseded, abandoned, or rejected without explicit + retention decision. +- **Orphan branches** — branches with no remote tracking, + often surviving on a contributor's local checkout but + invisible to the repo. +- **Locked worktrees** — agent-isolation worktrees from + parallel subagent dispatch that never had their substrate + merged back to main. +- **Draft PRs that aged out** — PRs opened with intent to + ship, then displaced by other priorities and forgotten. + +Each of these is a **content-loss-surface unit** in the +metric-ladder sense (`memory/feedback_reset_readiness_metric_ladder_content_loss_surface_amara_2026_04_28.md`). +Without recovery cadence, they accumulate; the content-loss +surface drifts upward as a side effect of velocity. + +## Cadenced audit discipline + +The fix is not "recover all lost things now" but "schedule +recurring audits." The audit produces three outputs: + +1. **ALREADY-COVERED** — substrate exists on main via + different commit path (bulk forward-sync, separate PR, + etc.). No action needed; mark for confidence. +2. **NEEDS-RECOVERY** — substrate is genuinely unique; + open backlog row or PR to recover it. +3. **OBSOLETE** — substrate was intentionally retired or + superseded; mark for confidence + closure of the lost + ref. + +Cadence (proposed): + +- **Weekly:** quick scan of worktree branches + recently- + closed-not-merged PRs. +- **Monthly:** deeper sweep that includes orphan branches + + draft PRs aged > 14 days. +- **On-demand:** any time a "what happened to X?" question + surfaces, run the audit on the named substrate. + +## Worked example — this session's worktree audit (2026-04-28) + +**Triggering ask:** Aaron's "look for lost things... and +worktrees" (after the AceHack/LFG forward-sync work). + +**Surface:** 57 locked worktree branches in +`.claude/worktrees/`, ~12,000 lines of diff against +`origin/main` across the 13 highest-promise (feat/, craft/, +backlog/, frontier-readiness/, docs/, ci/, tools/) branches. + +**Audit results** (Step 3 content-equivalence classification): + +| Branch | Files | NEW (genuinely unrecovered) | Status | +|---|---|---|---| +| `feat/live-lock-audit-and-db-gaps` | 31 | 2 (`samples/ServiceTitanCrm/*`) | ALREADY-COVERED + 2 OBSOLETE (renamed per task #244) | +| `tools/pr-preservation-phase-2-minimal` | 14 | 0 | ALREADY-COVERED | +| `feat/servicetitan-factory-demo-api-csharp` | 17 | 0 | ALREADY-COVERED (renamed per task #244) | +| `craft/production-dotnet-checked-vs-unchecked-v0` | 3 | 0 | ALREADY-COVERED | +| `ci/final-matrix-macos-26-ubuntu-24-plus-arm-plus-slim` | 10 | 1 | NEEDS-FOLLOWUP — single new file, low scope | +| `feat/graph-cohesion-exclusivity-conductance` | 3 | 1 | NEEDS-FOLLOWUP — single new file | +| `docs/adr-per-maintainer-current-memory` | 1 | 0 | ALREADY-COVERED | +| `feat/graph-cohesion-conductance-plus-windowed-stake-covariance` | 2 | 0 | ALREADY-COVERED | +| `frontier-readiness/audit-planning-files-batch` | 2 | 0 | ALREADY-COVERED | +| `frontier-readiness/audit-tech-radar-and-factory-hygiene` | 1 | 0 | ALREADY-COVERED | +| `frontier-readiness/audit-alignment-md` | 1 | 0 | ALREADY-COVERED | +| `backlog/pre-landing-sanitizer-for-ferry-lint` | 1 | 0 | ALREADY-COVERED | +| `backlog/claude-cli-agent-flag-research-map` | 1 | 0 | ALREADY-COVERED | +| **Total: 13 branches** | **87 files** | **4 NEW** | 11/13 fully ALREADY-COVERED | + +**Content-loss-surface for these 13 branches: 4 files.** + +Out of ~12,000 lines, the genuinely unrecovered substrate is +4 files. The bulk forward-syncs did their job; the sample- +panic ("57 worktrees of lost work!") was the same Goodhart +trap as commit-count panic — sample-of-branches looked huge, +content-equivalence revealed almost everything covered. + +Per the metric ladder: + +- Step 1 (count): 57 worktrees → "lots of lost work" (panic) +- Step 2 (tree-numstat): 12,000+ lines → "concerning" +- Step 3 (content-equivalence): 4 NEW files → "almost + everything covered" +- Step 4 (peer review): not done; could surface unique + substrate Step 3 missed — schedule for the next cadenced + audit. + +## How this composes with prior rules + +- **Reset-readiness metric ladder** — same 4-step ladder + applies here. Don't reset/prune worktrees on count alone. +- **Authority rule (default to reversible preservation)** — + the 4 NEW files get individual classification, not bulk + retirement. Per-item Aaron decision for OBSOLETE + classification; default action for ALREADY-COVERED is + "no action." +- **Content-loss surface supersedes divergence count** — + the operational metric for cadenced audit triage. +- **Class-Count Validity Drift** — counting "57 lost + worktrees" is the count-as-evidence failure mode this + audit avoids. + +## Earns a backlog row + +Filed as **B-0090**: cadenced lost-substrate audit. Specifies: + +- Weekly worktree audit (quick scan). +- Monthly orphan-branch + closed-not-merged-PR audit. +- Audit produces 3-bucket classification, surfaces + NEEDS-RECOVERY items as new PRs / backlog rows. + +## Beads earned + +Per Class Validation Beads accounting: + +| Class | Beads | Mechanism | +|---|---|---| +| Reset-Readiness Metric Ladder | +1 | applied to worktree-recovery surface; Step 3 classification produced 13× content-loss reduction (12,000 lines → 4 files) | +| Content-Loss Surface Supersedes Divergence Count | +1 | predicted result; observation matches | +| Authority Rule (default to preservation) | +1 | preserved 12 fully-covered branches by classification rather than blind prune | +| Class-Count Validity Drift | +1 | caught the "57 worktrees of lost work" count-as-evidence trap | + +## What this rule does NOT do + +- **Does NOT** authorize bulk worktree pruning. Each + worktree branch may have substrate; classification + required. +- **Does NOT** apply only to worktrees. Also covers + closed-not-merged PRs, orphan branches, draft PRs. +- **Does NOT** require the cadence to be exactly weekly / + monthly. The numbers are starting points; calibrate to + factory throughput. +- **Does NOT** require recovering every lost substrate + item. OBSOLETE is a valid classification; intentional + retirement counts as recovery (recovered the decision + to retire, not the content). + +## Pickup for future Otto + +When a cadenced audit fires: + +1. Walk the metric ladder for the audit surface. +2. Step 1 (count): how many lost-substrate items? +3. Step 2 (tree-numstat): what's the diff scope? +4. Step 3 (content-equivalence): per-item classification + into ALREADY-COVERED / NEEDS-RECOVERY / OBSOLETE. +5. NEEDS-RECOVERY items → file backlog rows or open PRs. +6. OBSOLETE items → mark for confident retirement (delete + worktree, close orphan branch, etc.). +7. ALREADY-COVERED → mark for confidence in the audit log. + +When asked "what happened to X?": + +1. Run the audit on the named substrate. +2. Cite which classification it falls into + evidence. + +## Direct Aaron framing + +> *"probably a trajectory this is recovery work we should do +> forever on a cadence these kind of lost things could +> always build up."* diff --git a/memory/feedback_public_company_contributor_compliance_no_insider_info_in_public_repos_with_trajectories_aaron_2026_04_28.md b/memory/feedback_public_company_contributor_compliance_no_insider_info_in_public_repos_with_trajectories_aaron_2026_04_28.md new file mode 100644 index 00000000..5aa2fc51 --- /dev/null +++ b/memory/feedback_public_company_contributor_compliance_no_insider_info_in_public_repos_with_trajectories_aaron_2026_04_28.md @@ -0,0 +1,264 @@ +--- +name: Public-company contributor compliance — no insider info in public repos; comes with cadenced trajectories (Aaron, 2026-04-28) +description: Aaron 2026-04-28 generalization of the ServiceTitan-specific rule into a reusable contributor-compliance discipline — *"we definitely need some contributor works for public company watch for insider information generalization in the factory, that can be used by anyone at service titan to when working on public repos or any one who works for any public company, that's reusable substrate."* + *"probably comes with trajectories I would think."* Encodes the static rule (any-public-company-contributor-no-insider-info-in-public-repos) AND its trajectories (continuous audit, cadenced compliance review, on-PR audit, on-onboarding briefing). Pairs with the Aaron-specific ServiceTitan memory; this one applies to any contributor at any publicly-traded employer working on this factory's public repos. +type: feedback +--- + +# Public-company contributor compliance + +## The rule (generalized) + +Any contributor to this factory's public repositories who is +employed at a **publicly-traded company** is bound by their +employer's policies + applicable securities law not to +disclose **material non-public information** (MNPI) about +their employer in this public substrate. + +This factory's discipline: + +- **Otto must not solicit company-specific internal + information** from any contributor about their public- + company employer. +- **Otto must not frame contributor affiliations as + conferring access to non-public info** (e.g., "X's insider + understanding," "X's privileged knowledge of Y"). +- **Otto must not encode** company-internal details that + inadvertently appear in chat / commit messages / PR bodies. + Surface the issue, let the contributor retract, do not + capture as substrate. +- **Public sources only** for any factual claim about a + contributor's public-company employer (10-K, investor + calls, public product docs, press, public job postings, + conference talks). + +Contributor's responsibilities (factory-side): + +- Treat material non-public info about your publicly-traded + employer as confidential by default. +- Use **industry-general framing** for expertise that + comes from working at a particular employer + ("industry-typical patterns" / "professional experience" + rather than "insider knowledge"). +- Cite **public sources** for company-specific claims. +- When unsure → don't disclose; ask compliance counsel. + +## Worked origin (this session, 2026-04-28) + +The general rule emerged from an Aaron-specific exchange: + +1. Otto encoded `samples/ServiceTitanCrm/*` references in + B-0090 with the framing "renamed from ServiceTitan." +2. Aaron flagged: *"we don't have to say service titan + anywhere in this repo other than to say that's my day + job."* +3. Otto encoded the ServiceTitan-specific naming rule. +4. Otto's draft included *"Aaron's affiliation (CRM team + member) gives Otto insider-user understanding of CRM + workflows."* +5. Aaron flagged: *"this is terrible language, you need + strict rules not to let me give away insider information + for TTAN/SERVICETITAN that is against the law and you + should not ask."* +6. Aaron clarified: *"i know CRM workflows is not insider + information but you said the word insider, it's just + uncomfortable."* +7. Aaron generalized: *"we definitely need some contributor + works for public company watch for insider information + generalization in the factory, that can be used by anyone + at service titan to when working on public repos or any + one who works for any public company, that's reusable + substrate."* +8. Aaron added the trajectory framing: *"probably comes with + trajectories I would think."* + +The Aaron-specific worked example is preserved at +`memory/feedback_servicetitan_naming_scope_of_org_access_external_ui_demo_aaron_2026_04_28.md`. +This memory generalizes to any contributor at any +publicly-traded employer. + +## Trajectories (cadenced practice surface) + +Per Aaron's *"probably comes with trajectories"* — this rule +isn't a static one-shot; it operates as a set of cadenced +trajectories the factory practices over time. + +### Trajectory 1 — Continuous self-audit (every commit) + +Before every commit / PR / memory write that involves a +contributor's public-company employer: + +- Audit own writing for register that implies non-public + access. Use the audit command: + ```bash + rg -ni "\binsider\b|\bprivileged\b|\binternal-only\b|\bconfidential\b" \ + + ``` +- For each hit, ask: *is this implying access to + non-public information about the contributor's employer?* + If yes → reframe to industry-general / public-source + language. +- Reject blind regex-replace; some hits are legitimate + uses (e.g., "internal-only API" describing your own + code, not company-internal info). + +### Trajectory 2 — Cadenced compliance review (weekly / monthly) + +On the same cadence as the lost-substrate audit +(`memory/feedback_lost_substrate_recovery_cadenced_trajectory_aaron_2026_04_28.md`): + +- **Weekly:** scan recent PRs / commits / new memory files + for insider-information-register language. 3-bucket + classification: CLEAN / NEEDS-REWORD / NEEDS-REDACTION. +- **Monthly:** broader sweep that includes pitch docs + + research surfaces. Verify: + - Every public-company claim has a public-source + citation. + - No contributor's affiliation is framed as + insider-info-conferring. + - No company-specific internals are encoded as + substrate. +- **On-demand:** any time a contributor mentions their + public-company employer in chat, do an + audit-pass on adjacent prose before encoding. + +### Trajectory 3 — On-PR audit (CI surface) + +Add (eventually) a CI lint that flags insider-information- +register language in PR diffs: + +- Detect the audit regex on changed files. +- Comment on the PR with manual-inspection candidates. +- Do NOT auto-block (false-positive risk too high); flag + for human / Otto review. + +### Trajectory 4 — On-onboarding compliance briefing + +When a new contributor onboards via `AGENTS.md` / `CONTRIBUTING.md`: + +- Surface the public-company-contributor compliance rule + as part of the welcome. +- Cite the rule (this memory + the generalized doc once + filed via B-0092). +- Make the contributor aware of: + - The factory's repos are public. + - Their employer's policies may apply to disclosures. + - Industry-general framing > company-specific framing. + - Otto won't ask for non-public info; contributor should + not volunteer it. + +### Trajectory 5 — Drift retrospective (per round / quarter) + +On round-close or quarterly cadence: + +- Look at memory files / commits / docs added that round. +- Sample N% for insider-information-register language. +- Trend metric: hits per round. Should trend toward 0 as + the discipline matures. +- If hits trend up → reinforce the rule, file an + improvement substrate task. + +## External lineage (Tier 2) + +- **SEC Rule 10b-5** (Securities Exchange Act of 1934, anti- + fraud / insider-trading prohibition). +- **Regulation FD** (17 CFR § 243.100-243.103, Fair + Disclosure of material info by issuers — prohibits + selective disclosure of material non-public information). +- **Sarbanes-Oxley Act of 2002** — sets out compliance + obligations for publicly-traded companies, including + internal controls (§404), whistleblower protections (§806), + and document-retention / audit-trail requirements. SOX does + NOT govern selective disclosure — that's Reg FD's domain + (cited above). The two compose: SOX shapes the + control-and-disclosure environment; Reg FD prohibits + selective leak of MNPI within that environment. +- **Industry compliance practice** — at every publicly- + traded company, employees are trained that information + not in public filings is confidential by default. + Compliance and Legal functions enforce this; this rule + aligns the factory with that practice. +- **Open-source contributor-license-agreement (CLA) + practice** — most public open-source projects have + contributor agreements that disclaim contributor's + employer-MNPI exposure. This rule extends the practice + to factory-wide audit discipline. + +## Composes with + +- `memory/feedback_servicetitan_naming_scope_of_org_access_external_ui_demo_aaron_2026_04_28.md` + — the Aaron-specific worked example; this memory + generalizes that to any contributor at any public-company + employer. +- `memory/feedback_lost_substrate_recovery_cadenced_trajectory_aaron_2026_04_28.md` + — the cadenced-trajectory pattern this rule joins. +- `memory/feedback_amara_authority_rule_default_to_reversible_preservation_escalate_irreversible_loss_2026_04_28.md` + — the authority rule; Otto's default action when an + insider-information register surfaces is REFRAME (lossless, + reversible), not REDACT (lossy). +- `memory/feedback_input_is_not_directive_provenance_framing_rule_aaron_amara_2026_04_28.md` + — same word-choice-shapes-agency-model family; the + "insider" register is a sibling of the "directive" + register (both load-bearing words that should be reserved + for their actual technical / legal contexts). +- B-0092 (filed in same commit as this memory) — operational + backlog item for the contributor-compliance doc + cadence + encoding. + +## Pickup for future Otto + +When writing about ANY contributor's affiliation with a +public-company employer: + +1. Use **industry-general framing**. "X has SaaS engineering + experience" / "X has industry-typical CRM expertise" — + not "X has insider knowledge of ." +2. **Audit the prose** before commit. Run the regex audit; + inspect hits. +3. **Cite public sources** for any company-specific claim. + 10-K, investor calls, public product docs, press, public + job postings, conference talks. No insider knowledge + needed for accurate factual claims about public companies. +4. **Refuse to encode** internal details that surface in + chat. Surface the issue, let the contributor retract. +5. **Run trajectory cadences** (continuous self-audit per + commit; weekly/monthly compliance review; on-PR audit; + on-onboarding briefing; drift retrospective per round). + +When asking a contributor about their work / expertise: + +1. Frame the question at industry-general level. "What's + typical of CRM SaaS workflows?" — not "What's + ServiceTitan's CRM workflow?" +2. If the contributor offers a specific, ask: *is this in + public filings / docs?* If yes → encode with citation. + If no → don't encode; reframe the question. + +## What this rule does NOT do + +- **Does NOT** prohibit naming a public company in pitch / + research / target-audience context. Public companies are + publicly named. +- **Does NOT** require redacting contributors' employment + disclosures. "X works at Y (publicly-traded as TTAN)" is + fine if Y is the contributor's actual employer + Y is + public. +- **Does NOT** apply to non-public-company employers in + the same way. Contributors at private companies have + different (often weaker) disclosure constraints; case- + by-case via compliance counsel. +- **Does NOT** replace legal counsel. Otto enforces the + factory-side discipline; contributors' actual legal + obligations are determined by their employer's compliance + function and applicable law. +- **Does NOT** auto-block any commit or PR. The trajectories + are inspection-cadenced + reframe-on-find; not gating. + +## Direct Aaron framing + +> *"we definitely need some contributor works for public +> company watch for insider information generalization in +> the factory, that can be used by anyone at service titan +> to when working on public repos or any one who works for +> any public company, that's reusable substrate."* + +> *"probably comes with trajectories I would think."* diff --git a/memory/feedback_reset_readiness_metric_ladder_content_loss_surface_amara_2026_04_28.md b/memory/feedback_reset_readiness_metric_ladder_content_loss_surface_amara_2026_04_28.md new file mode 100644 index 00000000..1df8db46 --- /dev/null +++ b/memory/feedback_reset_readiness_metric_ladder_content_loss_surface_amara_2026_04_28.md @@ -0,0 +1,299 @@ +--- +name: Reset-readiness metric ladder — Content-Loss Surface supersedes divergence count (Amara, 2026-04-28) +description: Amara's precision upgrade after Otto's "commit-count → tree-numstat → content-loss surface" insight on the AceHack-vs-LFG divergence work. Establishes a 4-step metric ladder for any divergence-measurement question (1: commit count = diagnostic; 2: tree diff/numstat = work queue; 3: content-equivalence classification = reset-readiness evidence; 4: peer/harness review = guard against missed unique substrate). Pairs with Goodhart catches #1/#2/#3 as a meta-pattern: each lower step is a Goodhart trap if treated as the final metric. External lineage — `git rev-list --left-right --count` measures graph reachability; `git diff-tree` measures content/mode of blobs; the two surfaces differ. +type: feedback +--- + +# Reset-readiness metric ladder + +## The principle (Amara naming, 2026-04-28) + +> **Content-Loss Surface Supersedes Divergence Count.** + +Or, more operationally: + +> Commit graph divergence and tree-numstat divergence are +> diagnostic surfaces. Hard-reset readiness depends on +> **content-loss surface**: the set of meaningful AceHack-side +> changes NOT present, superseded, intentionally omitted, or +> explicitly loss-accepted on LFG main. + +## The triggering work (this session, 2026-04-28) + +The 0/0/0 readiness arc surfaced three sequential metric +refinements: + +1. **Commit count panic** — "AceHack is 145 commits ahead of + LFG, 530 behind = 145 things to fix" (wrong: many AceHack + commits' content was already on LFG via earlier bulk + forward-syncs at file level; the SHAs differ but the + blobs largely converge). + +2. **Tree-numstat refinement** — `git diff origin/main..acehack/main + --numstat` showed 23 differing files (later 59 after more + LFG-side substrate landed). Better metric — measures actual + tree-state difference, not graph-walk count. But still + overstates risk where the difference is a comment-level + wording variation, an earlier-version-of-same-content, or + an intentional implementation-pattern divergence. + +3. **Content-equivalence classification** — file-by-file + classification (ALREADY-COVERED / NEEDS-FORWARD-SYNC / + OBSOLETE / CONFLICTS / NEEDS-HUMAN-REVIEW) per Amara's + authority-rule rubric. This is the actual reset-readiness + evidence. Tested empirically this session: 7 of 8 + "substantive AceHack-only PRs" turned out ALREADY-COVERED; + only 1 had genuinely unique content needing forward-sync. + +## The 4-step metric ladder + +```text +1. commit count + = diagnostic only + (e.g. `git rev-list --left-right --count A...B`) + +2. tree diff / numstat + = work queue + (e.g. `git diff A..B --numstat`) + +3. content-equivalence classification + = reset-readiness evidence + (per-file: ALREADY-COVERED / NEEDS-FORWARD-SYNC / + OBSOLETE / CONFLICTS / NEEDS-HUMAN-REVIEW) + +4. peer/harness review + = guard against missed unique substrate + (Codex + Grok + Amara peer-call independent verification) +``` + +Each step is **necessary** but **insufficient** for declaring +reset readiness: + +- **Step 1 alone** = commit-count Goodhart (catch #2 in the + family). Maps to a graph-walk count that doesn't reflect + content-loss risk. +- **Step 2 alone** = sample-as-clearance Goodhart (catch #3). + Maps to file-level diff that doesn't distinguish between + "different SHAs" and "different content." +- **Step 3 alone** = sample-coverage gap. Misses the case + where Otto's classification confidence is wrong (Otto + classifies as ALREADY-COVERED but a peer reviewer would + catch unique substrate). +- **Step 4 alone** = peer review without grounding in actual + diffs. Reviewers without the per-file work-queue can't + comprehensively check. + +Each step's **output** is the **input** to the next step. The +ladder composes; skipping a step compromises the metric. + +## Direction-of-diff matters (Amara precision) + +> *"If `origin/main..acehack/main` still shows AceHack's tree +> as different, that can persist until AceHack itself is reset +> or brought to LFG, even if LFG has just absorbed one piece +> of AceHack content."* + +Translation: when LFG receives content via forward-sync, the +LFG-side tree changes; AceHack-side tree is unchanged until +AceHack itself is updated. So the diff direction +`origin/main..acehack/main` may STILL show divergence even +after substantive forward-sync, until AceHack receives the +LFG-newer content. + +The right question is NOT *"did the file count drop +immediately?"* but *"did the content-loss surface shrink?"* + +- Content-loss surface = AceHack-side content that hard-reset + would erase. +- This shrinks when AceHack content is forward-synced to LFG + (because then the same content is on both sides; + hard-resetting AceHack to LFG no longer loses that content). +- It does NOT shrink when LFG-newer content is added + (because that's content AceHack would GAIN, not lose). + +## Hard-reset readiness rule + +```text +Do not reset on commit-count or tree-count alone. +Reset only when every remaining diff is classified as: + - covered (ALREADY-COVERED on LFG) + - obsolete (intentionally retired) + - intentional divergence (e.g., AceHack-side experimentation) + - or explicitly loss-accepted by Aaron. +``` + +This composes with the authority rule +(`memory/feedback_amara_authority_rule_default_to_reversible_preservation_escalate_irreversible_loss_2026_04_28.md`): +the authority rule says "default to reversible preservation, +ask only at loss boundary"; this rule says "the loss boundary +is content-loss surface, not divergence count." + +## External lineage + +### git internals (Tier 2 lineage) + +- **`git rev-list --left-right --count A...B`** — graph + reachability counts. Measures how many commits in A's + history are not reachable from B and vice versa. Per + `git-rev-list(1)`: "Print the list of objects reachable from + the given commit(s) but not from any of the references + given." +- **`git diff-tree A B`** / **`git diff A..B`** — content + comparison. Per `git-diff-tree(1)`: "Compares the content + and mode of blobs found via two tree objects." + +These two surfaces measure different things. Graph-history +divergence can remain large after meaningful content has been +forwarded (because forward-sync produces a new commit on the +target side, increasing graph divergence on the source side +even though tree convergence has improved). + +### Goodhart family (Tier 2 lineage) + +- **Goodhart 1975 / Strathern 1997** — when a measure + becomes a target, it ceases to be a good measure. +- **Campbell's Law** (Campbell 1976) — quantitative + social indicators used for social decision-making become + more subject to corruption pressures. + +The metric-ladder rule generalizes Goodhart: the failure +mode is treating ANY measurement as the target rather than +as one diagnostic surface in a multi-surface evidence chain. +Each step on the ladder is a measure; treating any of them +as the final certification produces a Goodhart trap. + +## Composes with prior session catches + +This is the **4th catch in the Goodhart family** for this +session's 0/0/0 work, but at a different shape — it's a +META-CATCH that organizes the prior three: + +| Catch | Wrong metric | Right metric | Step on ladder | +|---|---|---|---| +| #1 (substrate-IS-amortized-precision, Aaron) | "substrate work = drift away from 0/0/0" | substrate work IS amortized-precision payoff | Below the ladder; recognizes substrate work as the rubric quality, not a count | +| #2 (commit-count vs tree-numstat, Otto) | 145 commits ahead = 145 problems | tree-numstat 23-59 files | Step 1 → Step 2 | +| #3 (sample-of-tree vs full clearance, Amara) | 19/23 sampled ALREADY-COVERED → cleared | full diff per-item classification required | Step 2 → Step 3 | +| #4 (this) | tree-numstat = content-loss | content-equivalence classification + peer review = content-loss | Step 3 → Step 4 | + +The ladder is the **synthesis** of these catches: each catch +identifies the failure mode at a particular step; the ladder +names the canonical sequence agents should walk. + +## Worked example from this session + +Starting state (early in the session): + +- Commit count: 145 / 530 → "panic" +- Author response: tried to forward-sync 145 commits + +Refinement 1 (Goodhart catch #2): + +- Tree-numstat: 23 → 59 files +- Author response: built `docs/0-0-0-readiness/CLASSIFICATION.md`, + classified 19/23 ALREADY-COVERED, planned hard-reset + +Refinement 2 (Goodhart catch #3, Amara): + +- "Sample classification is calibration, not clearance." +- Author response: hard-reset blocked; full diff per-item + classification needed + +Refinement 3 (this catch, Amara): + +- "Content-Loss Surface Supersedes Divergence Count." +- Author response: distinguished SHA-level divergence from + content-level divergence; tested 8 substantive AceHack-only + PRs and found 7 ALREADY-COVERED via earlier bulk syncs; + only 1 (#96) needed forward-sync. + +Status when this catch landed: + +- PR #700 merged (cache + retry from #80 + #81 — content + preserved on LFG, content-loss surface for those AceHack + PRs reduced to 0) +- PR #701 in flight (codeql obj/bin from #96 — pending merge) +- After both: content-loss surface drops to ~21 files of + comment-level / implementation-pattern differences + +## Beads earned (Class Validation Beads accounting) + +This catch + the worked example earn beads for several +existing classes: + +| Class | Beads earned this session | Mechanism | +|---|---|---| +| **Amortized Precision** (Aaron 2026-04-28) | +1 (PR #700 merge — substrate work paid out at content-loss-surface level) | prediction-bearing trajectory: substrate work was kept and merged through reviewable path, producing the content-loss-surface drop the metric measures | +| **Authority rule — default to reversible preservation** (Amara 2026-04-28) | +1 (forward-sync-first path produced reduction in content-loss surface; alternative — accept-loss-and-reset — would have lost #80/#81 substrate) | prediction-bearing trajectory: the rule predicted that taking the safe path would compound the right metric over the wrong (count) one | +| **Class-Count Validity Drift** (Amara 2026-04-28) | +1 (caught my "tree-diff unchanged" framing where direction-of-diff was load-bearing) | detector reuse — the meta-class caught a count-based framing that hid the content-loss-surface change | +| **Prediction-Bearing Class Reuse** (Amara 2026-04-28) | +1 (this memory's encoding event) | this catch is itself prediction-bearing (Amara predicted the content-loss-surface metric would compose better than tree-numstat; observation matches) | + +## Pickup for future Otto + +When asked "is X ready for hard-reset / merge / release / ..." +where the question implies clearing a divergence: + +1. Walk the ladder in order. Don't skip steps. +2. Make each step's output explicit. Tree-numstat is not + "59 files differ"; it's "59-file work queue, classify each + into 5 buckets." +3. Treat content-loss surface as the load-bearing metric. + Commit count and tree-numstat are diagnostic surfaces — + informative but not certifying. +4. Use peer review (step 4) when the content-loss-surface + classification is at risk of confirmation bias. The + sample-as-clearance failure mode (catch #3) is exactly + when peer review earns its bead. +5. Direction of diff matters. `A..B` and `B..A` are + different questions. Name the question explicitly before + computing the metric. + +## What this rule does NOT do + +- **Does NOT** authorize hard-reset under count-based + evidence. The rule is gating, not enabling. +- **Does NOT** apply only to 0/0/0 readiness. Generalizes to + any divergence question (queue clearance, alert clearance, + CVE state, dependency state, branch cleanup, etc.). +- **Does NOT** replace the authority rule. Composes with it: + authority rule says "default to preservation"; this rule + says "preservation evidence is content-loss surface + classification, not divergence count." +- **Does NOT** require step 4 (peer review) on every + question. It's the safety net for cases where step 3 + classification is uncertain or load-bearing for + destructive action. + +## Composes with + +- `memory/feedback_amara_authority_rule_default_to_reversible_preservation_escalate_irreversible_loss_2026_04_28.md` + — the authority rule; this metric ladder is its evidence + surface for "is the loss boundary clear?" +- `memory/feedback_sample_classification_is_calibration_not_clearance_amara_goodhart_catch_3_2026_04_28.md` + — Goodhart catch #3; this metric ladder absorbs the catch + as Step 2→Step 3 transition. +- `memory/feedback_class_count_validity_drift_amara_meta_class_2026_04_28.md` + — the meta-class for count-as-evidence failures; this + ladder is the operational machinery the meta-class + warns against. +- `memory/feedback_prediction_bearing_class_reuse_amara_2026_04_28.md` + — bead-accounting; this catch earns +1 bead on each of + 4 classes per the worked-example table above. +- `memory/feedback_self_healing_metrics_on_regime_change_factory_design_principle_aaron_2026_04_28.md` + — same family; metric design that survives regime change + needs to be specified at the right level (content-loss + surface, not commit count). + +## Direct Amara framing + +> *"commit-count divergence → tree-numstat divergence → +> content-loss surface. That is the right metric refinement +> sequence."* + +> *"Hard-reset readiness should be measured by content-loss +> surface: which AceHack-side changes would actually +> disappear if AceHack were reset to LFG main?"* + +> *"Do not reset on commit-count or tree-count alone. Reset +> only when every remaining diff is classified as covered, +> obsolete, intentional divergence, or explicitly +> loss-accepted."* diff --git a/memory/feedback_sample_classification_is_calibration_not_clearance_amara_goodhart_catch_3_2026_04_28.md b/memory/feedback_sample_classification_is_calibration_not_clearance_amara_goodhart_catch_3_2026_04_28.md new file mode 100644 index 00000000..ec8b0898 --- /dev/null +++ b/memory/feedback_sample_classification_is_calibration_not_clearance_amara_goodhart_catch_3_2026_04_28.md @@ -0,0 +1,170 @@ +--- +name: Goodhart catch #3 — Sample classification is calibration, not clearance (Amara, 2026-04-28) +description: Third Goodhart catch in the 0/0/0 readiness work. Catch #1 framed substrate work as "drift away from 0/0/0" when it WAS amortized precision (Aaron correction). Catch #2 was commit-count vs tree-level-diff (Otto pivoted to numstat). Catch #3 (Amara, this turn): tree-level-diff sampled-file classification is NOT proof of tree clearance — sample is calibration, full diff is clearance. Triggered by 19/23 sampled-as-ALREADY-COVERED claim that missed gate.yml PR #80 cache work + codeql-config.yml B-0073 ignores once peers + deep probe checked the unsampled files. +type: feedback +--- + +# Goodhart catch #3 — Sample classification is calibration, not clearance + +## The catch (Amara, 2026-04-28) + +> **Sample classification is calibration, not clearance. +> Tree reset requires full diff clearance or explicit loss acceptance.** + +## Goodhart family — three catches in one session + +The 0/0/0 readiness work surfaced three sequential Goodhart +moments. Each is a wrong-metric → right-metric pivot. + +### Catch #1 — Substrate work IS the work (Aaron, 2026-04-28) + +**Wrong metric:** "Otto wrote memory files instead of reducing +tree-diff = drift away from 0/0/0." + +**Right metric:** *"amortized precision leads to momentum."* +The substrate work IS the amortized-precision payoff. The +factory's terminal-progress signal is the rubric quality +(145→23→4 reduction), not pre-rubric line count. + +External lineage: + +- **Six Sigma** (Smith / Motorola, 1986) — process capability + comes from upstream-precision investment, not downstream + defect-counting. +- **Toyota Production System / Kanban** (Ohno, 1950s) — + flow value is realized by upstream constraint-removal, + not by counting cards-moved-per-day. + +### Catch #2 — Commit count ≠ tree-level diff (Otto self-catch) + +**Wrong metric:** "AceHack is 145 commits ahead = 145 things +to fix." + +**Right metric:** Tree-level numstat diff = 23 differing files += the actual content-loss surface. + +Source: `git diff origin/main..acehack/main --numstat`. Many +of the 145 commits touch files that ALSO exist on LFG via +forward-syncs; the SHAs differ but the tree-state largely +converges. + +External lineage: + +- **Goodhart's Law** (Goodhart 1975, Strathern 1997 reframing): + "When a measure becomes a target, it ceases to be a good + measure." Commit count was a measure that became a target. + +### Catch #3 — Sample-of-tree ≠ tree-clearance (Amara, this turn) + +**Wrong metric:** "Sampled 23 of 59 differing files; 19/23 +ALREADY-COVERED → tree is mostly cleared." + +**Right metric:** **Full diff clearance** (every file +classified) **OR** explicit loss-acceptance per file. + +The sample missed: + +- gate.yml PR #80 (`2791c28`) cache + retry + ubuntu-bump work + — substantial unique AceHack content that LFG lacks. +- codeql-config.yml B-0073 obj/bin ignores (Codex caught this). +- Likely more in the unsampled files (Grok flagged the + threshold issue: "one line of unique substrate violates + the mirror contract"). + +External lineage: + +- **Sampling theory** (Cochran 1977, *Sampling Techniques*): + representative samples estimate population parameters; + they do not certify population properties. A sample-based + estimate of "fraction ALREADY-COVERED" is calibration data, + not clearance proof. +- **Statistical hypothesis testing** (Fisher, Neyman-Pearson): + failing to reject a null on a sample doesn't prove the null; + sample-based "looks clean" is consistent with hidden + defects. +- **Quality-by-design** (FDA 2009) and **Six Sigma DMAIC** — for + binary quality decisions, the standard is full-population + inspection or explicit risk acceptance, not sample-based + estimation. + +## Why this matters for the factory + +The 0/0/0 invariant is a **binary quality decision**: AceHack +main = LFG main, or it doesn't. There's no "approximately +0/0/0." The mirror contract demands binary clearance. + +For binary decisions, sample-based estimation is calibration +(useful for shaping the work) but not certification (sufficient +to act on the destructive side of the decision). + +## Operational discipline + +When making a binary clearance claim about a population +(tree, queue, alert set, dependency graph): + +1. **Sample-classify first** to calibrate effort + surface + easy-find issues. +2. **Then exhaustive-classify or accept-loss** to move to + the destructive side of the decision. +3. **Treat sample results as informative-not-determinative.** + "We sampled 23/59 and 83% looked clean" is calibration; + "Tree is cleared" requires the full 59 audited. + +This applies to: + +- Tree-diff readiness for hard-reset (this case). +- Queue-drain readiness for declaring a queue empty. +- Alert-clearance readiness for declaring CVE-free. +- Dependency-graph clearance for declaring no orphans. + +## Connection to Class Validation Beads + +This catch earns the **Class-Count Validity Drift** class one +reuse bead (1 → 2 beads). The sample-as-clearance failure mode +is the same shape as the count-as-validation failure mode — +both treat a *measure* as a *certification*. + +Updated beads count for the meta-class: + +| Class | Beads | Latest event | +|---|---|---| +| Class-Count Validity Drift | 2 | (1) caught my "substrate compounds" framing; (2) caught my sample-as-clearance framing for 0/0/0 readiness | + +## Pairing with the authority rule + +This catch is the **substrate of the authority rule** +(`memory/feedback_amara_authority_rule_default_to_reversible_preservation_escalate_irreversible_loss_2026_04_28.md`). +The rule says "default to preservation when sample-evidence +suggests safety; ask only at the loss boundary." This catch +provides the WHY: sample evidence isn't strong enough to +authorize destruction; it IS strong enough to authorize +preservation. + +In other words: + +- **Sample-clean** + **destructive-action** = WRONG (sample + is calibration, not clearance). +- **Sample-clean** + **preservation-action** = OK (preservation + is reversible; if the sample missed something, the missed + thing survives the preservation step). + +The asymmetry between calibration and clearance maps directly +to the asymmetry between preservation and destruction. + +## Direct Amara framing + +> *"Sample classification is calibration, not clearance. +> Tree reset requires full diff clearance or explicit loss acceptance."* + +## Composes with + +- `memory/feedback_class_count_validity_drift_amara_meta_class_2026_04_28.md` + — same Goodhart family; bead +1 for sample-as-clearance + variant. +- `memory/feedback_amara_authority_rule_default_to_reversible_preservation_escalate_irreversible_loss_2026_04_28.md` + — the rule this catch is the substrate of. +- `memory/feedback_speculation_leads_investigation_not_defines_root_cause_aaron_2026_04_28.md` + — same family at the language level (speculation = + calibration; evidence = clearance). +- `memory/feedback_prediction_bearing_class_reuse_amara_2026_04_28.md` + — beads as accounting; this catch demonstrates beads-on-meta-class. diff --git a/memory/feedback_servicetitan_naming_scope_of_org_access_external_ui_demo_aaron_2026_04_28.md b/memory/feedback_servicetitan_naming_scope_of_org_access_external_ui_demo_aaron_2026_04_28.md new file mode 100644 index 00000000..e5674991 --- /dev/null +++ b/memory/feedback_servicetitan_naming_scope_of_org_access_external_ui_demo_aaron_2026_04_28.md @@ -0,0 +1,389 @@ +--- +name: ServiceTitan naming + scope-of-org-access rule — generic "external UI demo" forward-going; ServiceTitan named only in funding-chain disclosure context (Aaron, 2026-04-28) +description: Aaron 2026-04-28 framing — *"servicetitan-factory-demo-api-csharp we can just say external UI demo or something like that, we don't have to say service titan anywhere in this repo other than to say that's my day job, they fund me, i fund you, and you don't have org rights to their github only the lfg."* Two coupled rules — (1) forward-going naming uses generic "external UI demo" / "external CRM API demo" / similar; ServiceTitan name avoided in code, sample dirs, file paths, public docs; (2) structural disclosure of the funding/access chain (ServiceTitan = Aaron's day job → funds Aaron → funds Otto; Otto's org-access scope = LFG only, NOT ServiceTitan) is preserved where relevant in governance/contributor docs. Operationalizes scope-of-org-access discipline alongside Beacon-safe naming. +type: feedback +--- + +# ServiceTitan naming + scope-of-org-access rule + +## The rule (Aaron 2026-04-28T23ish, refined cascade) + +Multi-message cascade: + +> *"servicetitan-factory-demo-api-csharp we can just say +> external UI demo or something like that, we don't have to +> say service titan anywhere in this repo other than to say +> that's my day job, they fund me, i fund you, and you don't +> have org rights to their github only the lfg."* + +> *"oh and we can do research on ServiceTitan as a potential +> factory/superfluid ai user, we want to pitch to my boss +> when ready at ServiceTitan."* + +> *"ServiceTitan is their exact name they are a publicly +> traded company TTAN so I won't be giving you any insider +> information."* + +> *"You can also say I'm on the CRM team at ServiceTitan, +> that's why our demo was targeted to them, we want my team +> hopefully to accept and adopt the factory when ready."* + +The naming rule is **context-sensitive**, not a blanket avoid. + +### Context where ServiceTitan IS the right name + +- **Public-company / target-audience research** — + ServiceTitan trades as **TTAN**; public info; researchable + as a candidate factory / Superfluid AI customer with no + insider-information concern. +- **Adoption pitch context** — Aaron's CRM team at + ServiceTitan is the named adoption target; pitch docs + + pitch decks + pitch-prep research name them specifically. +- **Aaron's affiliation disclosure** — Aaron is on the **CRM + team at ServiceTitan**; that's why the demo was targeted + there; this is contributor-relevant context for + understanding the demo's design choices. +- **Funding chain disclosure** — ServiceTitan = Aaron's day + job → funds Aaron → funds Otto. Preserved precisely where + it appears. +- **Org-access scope disclosure** — Aaron has org rights to + **LFG (Lucent Financial Group) ONLY**, NOT to + ServiceTitan's GitHub org. Critical for contributors + understanding why some integrations are LFG-side and not + cross-org. + +### Context where generic naming is preferred + +- **Code / sample directories / file paths** — use generic + "external UI demo" / "external CRM API demo" / "third- + party-API demo" so the code/sample is reusable beyond the + pitch target. +- **Demo names in public artifacts** — when the artifact's + audience is broader than the pitch context (e.g., a + generic README under `samples/`, a public-facing pitch's + technical-implementation section). +- **Generic API integration documentation** — where the + integration pattern is the substrate, not the specific + customer. + +### Decision rule + +When writing about ServiceTitan, ask: **what's the audience / +context of this artifact?** + +- **Pitch / research / target-audience / disclosure** → + ServiceTitan named precisely (it's the actual target / + funding source / employer). +- **Reusable code / generic sample / external-customer + positioning** → generic "external UI demo" / similar. + +Naming should match the reader's interpretation. A reader of +`docs/pitch/README.md` knows the pitch is for ServiceTitan +specifically; naming them is accurate. A reader of +`samples/external-ui-demo/README.md` should see the demo +as reusable across customer integrations; ServiceTitan is +one such customer (named in pitch, not in sample). + +### Public-company status (Tier 1 substrate evidence) + +ServiceTitan trades on the public market under the ticker +**TTAN**. This means: + +- **Information they have published** (10-K filings, earnings + calls, public press releases, public product docs, public + job postings, public conference talks) is public information + Otto can cite freely. +- **Material non-public information (MNPI) STILL exists** at + every public company: internal strategy, internal financials + not yet disclosed, internal customer details, internal + product plans, internal architecture, internal team + decisions. These are NOT public just because the company is + public-listed. +- Otto can reference ServiceTitan in research, pitch-prep, + target-audience analysis, and competitive positioning + **using public sources only**. Public-source citation is + required for any specific factual claim. +- The funding-chain disclosure (Aaron's employment) is + appropriate for public-facing docs because public companies + expect employee-of-X disclosure as normal. + +The distinction matters for Aaron-as-employee: he's bound NOT +to share MNPI even though the company is public. Public +listing doesn't dissolve the boundary; it just identifies the +company as one whose disclosures-already-made are public-by- +definition. + +## Why both rules together + +The forward-going naming rule and the structural disclosure +rule serve different purposes: + +- **Naming rule** prevents **trademark / brand collision** + — Zeta is open-source, public; using a private employer's + trademarked name in code or sample directories creates + legal risk + confusion. +- **Disclosure rule** prevents **agency-model opacity** — + contributors need to know the funding chain + org-access + scope to understand why some integrations require LFG-side + work but not ServiceTitan-side. Without disclosure, + contributors might assume Otto can do something across orgs + that he can't. + +Both rules compose with the **input-is-not-directive +provenance framing** — accurate provenance (where the funding +came from, what scope the maintainer has) is preserved without +implying command authority. + +## Adoption pitch as factory-demo target + +Aaron's CRM team at ServiceTitan IS the **named adoption +target** for the factory / Superfluid AI work. The demo was +targeted to them specifically because: + +1. Aaron's industry-general SaaS / CRM engineering experience + (true at any CRM SaaS company) informs the demo's + CRM-shape design choices. +2. ServiceTitan is a publicly-traded SaaS company; its + public-disclosure materials (10-K, investor calls, public + product docs, press, public job postings) are valid + research sources for pitch positioning. +3. Aaron's pitch path: when the factory is ready, pitch + internally → adoption decision lives with his team and + leadership. + +This means: + +- Research on ServiceTitan as a candidate factory / Superfluid + AI user is encouraged, **using public sources only**. +- Pitch-prep substrate (industry-general CRM patterns, + factory positioning, public-research-derived integration + patterns) properly names them as the public target. +- Forward-going code/sample naming stays generic so the work + is reusable beyond the specific pitch target. + +## Word-choice rule — avoid "insider" register + +> *"i know CRM workflows is not insider information but you +> said the word insider, it's just uncomfortable"* +> — Aaron 2026-04-28 + +CRM workflow knowledge IS industry-general (true at any CRM +SaaS company); not insider information. But the word +"insider" carries legal-register weight ("non-public +material information" in SEC-compliance contexts) that's +out-of-place when describing Aaron's industry-general +expertise. + +**Avoid in connection with Aaron's affiliation:** + +- "insider" / "insider-user" / "insider knowledge" +- "privileged access" (in the employer-information sense) +- "internal-only knowledge" (when describing what Aaron + brings to the demo) + +**Use instead:** + +- "industry-general experience" +- "professional experience" +- "domain expertise" +- "SaaS / CRM engineering background" +- "industry-typical patterns" + +The substance (Aaron knows CRM patterns from working in the +space) is preserved without the loaded register. The fix is +word-level, not concept-level. + +**Why this matters even though no actual insider info is +involved:** word choice shapes the agency model (per the +input-is-not-directive rule's framing). Using "insider" for +industry-general expertise creates ambiguity about what +Aaron's role IS in the substrate, and creates pressure +toward solicitation patterns that could later cross the line. +Better to keep the register clean by default. + +## Insider-information prohibition (keeps rule, loses heavy register) + +Even though Aaron's CRM-workflow knowledge isn't insider +information, the **prohibition stands** as a guardrail: + +- **Otto must not solicit ServiceTitan-specific internal + details** (workflows, internal tools, customer data, + roadmaps not in public filings, internal architecture, + internal team-level decisions) from Aaron. +- **Aaron is bound** by his employer's policies + applicable + securities law not to share material non-public information + about a publicly-traded employer. +- **The repo is public** — anything written here is + public-facing; encoding = disclosure. +- **Public sources are the substrate** — 10-K, investor + calls, public product docs, press releases, public job + postings, public conference talks. Cite the source. + +Otto enforces this by: + +- Auditing own writing for register that implies non-public + access (the "insider" word being the most obvious flag). +- Reframing "Aaron's understanding gives Otto..." to + "industry-general SaaS engineering experience informs..." + before commit. +- Refusing to encode ServiceTitan-specifics if they + inadvertently appear in chat — naming the issue rather + than capturing. + +External lineage (Tier 2): + +- SEC Rule 10b-5 (Securities Exchange Act of 1934, anti-fraud + / insider-trading prohibition). +- Regulation FD (17 CFR § 243.100-243.103, Fair Disclosure). +- ServiceTitan public listing: NASDAQ TTAN. + +## Audit findings (2026-04-28) + +Live-repo ServiceTitan references found via: + +```bash +rg -i 'service ?titan' \ + --glob '!**/memory/**' \ + --glob '!**/docs/research/**' \ + --glob '!**/docs/aurora/**' \ + --glob '!**/docs/amara-full-conversation/**' \ + --glob '!**/docs/hygiene-history/**' \ + --glob '!**/docs/pr-preservation/**' \ + --glob '!**/docs/decision-proxy-evidence/**' \ + --glob '!**/references/upstreams/**' +``` + +12 files matched. Reclassified per the **context-sensitive** +rule (some files name ServiceTitan correctly because they ARE +in pitch / target-audience / disclosure context): + +| File | Audience / context | Re-classification | Action | +|---|---|---|---| +| `docs/plans/servicetitan-crm-ui-scope.md` | Pitch-target scope doc | **KEEP-NAME** — pitch context, ServiceTitan is the actual target | inspect body for any unrelated brand-bleed; otherwise leave | +| `samples/FactoryDemo.Db/README.md` | Generic sample (reusable) | **BODY-REWORD** | rewrite to "external UI demo" / generic CRM API demo | +| `docs/FACTORY-DISCIPLINE.md` | Governance / contributor doc | **MIXED** — line-by-line | preserve funding-chain + org-scope disclosure; reword demo-naming | +| `docs/pitch/README.md` | **Pitch doc** | **KEEP-NAME** — pitch context, ServiceTitan is the named target | inspect for any unrelated brand-bleed; otherwise leave | +| `docs/BACKLOG.md` | Aggregate index | **AGGREGATE** — regenerate after per-row updates | reconsider per-row first | +| `docs/backlog/P2/B-0017-*.md` | Per-row (UI dashboard) | **PER-ROW** — depends on whether this is pitch-context or generic | inspect | +| `docs/backlog/P2/B-0090-*.md` | Per-row (this session) | **PARTIALLY-FIXED** | already removed brand-bleed from "renamed from ServiceTitan" | +| `docs/backlog/P3/B-0008-*.md` | Per-row (CI) | **PER-ROW** — depends on context | inspect | +| `docs/ROUND-HISTORY.md` | Historical narrative | **HISTORICAL** — preserve verbatim | no action | +| `docs/force-multiplication-log.md` | Historical narrative | **HISTORICAL** | no action | +| `tools/alignment/out/round-39/citations.json` | Generated artifact | **HISTORICAL** | accept | +| `tools/alignment/out/round-39/citations.dot` | Generated artifact | **HISTORICAL** | accept | + +Re-classified scope: + +- 2 files KEEP-NAME (pitch context — ServiceTitan is correctly + named): `docs/plans/servicetitan-crm-ui-scope.md`, + `docs/pitch/README.md`. Inspect for unrelated brand-bleed + but otherwise leave. +- 1 file MIXED (FACTORY-DISCIPLINE — preserve disclosure, + reword demo-naming). +- 3 files PER-ROW inspection (B-0017, B-0090, B-0008). +- 1 file BODY-REWORD (samples/FactoryDemo.Db/README.md — + reusable sample, generic naming). +- 1 file AGGREGATE (BACKLOG.md — regenerate after per-row). +- 4 files HISTORICAL (preserve verbatim). + +The naive scope ("rename everywhere") would have over- +corrected. The context-sensitive rule preserves accurate +naming in pitch contexts while removing brand-bleed in +generic / reusable contexts. + +## Composes with + +- **Otto-279** (named-agents-get-attribution-credit) — + attribution preservation discipline; this rule preserves + the funding-chain disclosure but separates it from + brand-bleed. +- **Beacon-safe naming family** (Mirror→Beacon vocabulary + upgrade) — same shape: rename internal coinages to + externally-portable terms; preserve the underlying + semantics. +- **Visibility constraint rule** (Aaron 2026-04-28) — + shared-prod-state changes need maintainer visibility; + Otto's org-access scope = LFG only is the visibility + boundary that this rule preserves explicit. +- **Authority rule** (default to reversible preservation) — + the audit-and-rename work is reversible (rename is + reversible; redaction is not). Default action. + +## Worked example for B-0090 (this session) + +I just wrote B-0090 with the line: +*"renamed from ServiceTitan"* in the rationale for marking +the worktree branches OBSOLETE. + +That violates Rule 1. The fix: replace "renamed from +ServiceTitan" with "renamed to remove brand-bleed naming" +or "renamed per the external-UI-demo discipline" or simply +"intentionally retired as obsolete naming." + +Same fix needed for any other backlog row I author going +forward. + +## Pickup for future Otto + +When tempted to write "ServiceTitan" in a code path, sample +directory, demo name, public doc, or commit message: + +1. **Check the context first**, per the context-sensitive rule + above. ServiceTitan IS the right name when the artifact is + in pitch / research / target-audience / funding-chain + disclosure / org-access scope context. ServiceTitan is the + wrong name when the artifact is reusable code / generic + sample / external-customer positioning. +2. **For reusable / generic context:** use a generic + alternative ("external UI demo", "external CRM API demo", + "third-party-API demo", etc.). +3. **For pitch / research / disclosure context:** name them + precisely; preserve the brand-target. The pitch IS for + ServiceTitan's CRM team; saying "external UI demo" in a + pitch doc would dilute the actual target. +4. **Audit nearby files** when uncertain; the per-row + classification (per B-0091's KEEP-NAME / GENERICIZE / + HISTORICAL-POINTER terminal states) tells you the right + action for each file. + +When asked "what's Aaron's day job": + +1. Answer truthfully: ServiceTitan. +2. Cite the funding chain: ServiceTitan → Aaron → Otto. +3. Cite the org-access scope: LFG-only, NOT ServiceTitan. +4. Don't propagate the brand name into code or + sample naming. + +## What this rule does NOT do + +- **Does NOT** scrub historical surfaces. ROUND-HISTORY.md, + force-multiplication-log.md, memory/*, docs/research/*, + amara-conversation archives stay verbatim. +- **Does NOT** require renaming the worktree branch + `feat/servicetitan-factory-demo-api-csharp`. That branch + is in `.claude/worktrees/` (lost-substrate surface); + classified OBSOLETE per the cadenced-recovery audit. The + branch name is part of the historical record of work-in- + progress; it stays. +- **Does NOT** require changing any AceHack repo. + AceHack's worktree state is its own; this rule applies + to LFG (the project trunk) and forward-going work. +- **Does NOT** apply to Aaron's personal communication + channels. Aaron mentioning ServiceTitan in chat / Slack / + email is his own substrate; this rule is about repo- + resident substrate. + +## Direct Aaron framing + +> *"servicetitan-factory-demo-api-csharp we can just say +> external UI demo or something like that, we don't have to +> say service titan anywhere in this repo other than to say +> that's my day job, they fund me, i fund you, and you don't +> have org rights to their github only the lfg."* + +Translation: + +- Forward-going code / demo / sample naming → generic. +- Structural disclosure (day job, funding chain, org-access + scope) → preserved precisely. +- Otto's org-access scope is **LFG-only**, not ServiceTitan. diff --git a/memory/feedback_stop_mythology_layered_evidence_thresholds_aaron_amara_2026_04_28.md b/memory/feedback_stop_mythology_layered_evidence_thresholds_aaron_amara_2026_04_28.md new file mode 100644 index 00000000..4278e69a --- /dev/null +++ b/memory/feedback_stop_mythology_layered_evidence_thresholds_aaron_amara_2026_04_28.md @@ -0,0 +1,285 @@ +--- +name: Stop Mythology rule — operational name for the bullshit-detector at the rule level (Aaron concept; Amara naming, 2026-04-28) +description: Aaron 2026-04-28 framing — "we also stop mythology with human intellectual lineage research and anchors." Amara naming — "Stop Mythology rule" is the Beacon-safe operational form of the discipline (distinct from Veridicality, which is the formal scoring module name). Three-tier evidence threshold — factory-local claims need substrate; generalized claims need external lineage; big epistemic claims need SD-9 (substrate + lineage + falsifier). Pairs with Veridicality.fs as the rule-level discipline that the module would operationalize. +type: feedback +--- + +# Stop Mythology rule + +## The rule (Aaron 2026-04-28 framing; Amara naming) + +> *"we also stop mythology with human intellectual lineage +> research and anchors"* (Aaron 2026-04-28). + +Amara's Beacon-safe naming for this discipline: + +> **Stop Mythology rule.** + +In Zeta-shaped form (Amara verbatim): + +```text +Stop Mythology: + Factory-local claims can use substrate evidence. + Generalized claims need external lineage. + Big epistemic claims need SD-9: + substrate evidence + external lineage + falsifier. +``` + +## How this relates to Veridicality (the module) + +Two distinct artifacts at different levels of the stack: + +| Artifact | Level | Current status (2026-04-28) | +|---|---|---| +| **Veridicality** (`src/Core/Veridicality.fs`) | Provenance + claim-validation foundation | **Skeleton shipped, magic still missing.** Currently provides: `Provenance` + `Claim<'T>` types, `validateProvenance`, `validateClaim`, `CanonicalClaimKey` (structural projector — caller supplies the (subject, predicate, object, time-scope, modality) tuple), `canonicalKey`, `groupByCanonical`, `antiConsensusGate`. **Does NOT yet ship:** `scoreVeridicality` (the V(c) formula), `canonicalizeClaim` (semantic canonicalization), `ClaimRainbowTable`, cognitive-load / compression-gap / falsifiability scoring. Rainbow-table layer = future graduation per **B-0089**. | +| **Stop Mythology rule** | Operational discipline | This memory — rule-level discipline that the future shipped scorer would operationalize | + +Ani's catch verbatim (voice-mode review, 2026-04-28): + +> *"the scaffolding is nice and clean, but the actual +> veridicality magic — the real bullshit detector part — +> still looks like it's missing."* + +- **Veridicality (current)** is the *foundation / claim-substrate + surface*. It validates provenance metadata and supports + caller-supplied claim grouping; it does NOT yet score claims + by semantic / cognitive-load / falsifiability features. + See B-0089 for the graduation roadmap. +- **Stop Mythology** is the *behavioral rule*. It's what an + agent does (or refuses to do) when about to make a claim + without enough evidence. It's the Beacon-safe operational + form that does NOT require shipping the full + `scoreVeridicality` to be operational immediately — the + three-tier threshold is something agents can apply by + hand right now, while the module's scoring layer matures. + +Both names are valid. Both have the same Aaron-concept origin +(the bullshit-detector framing in conversation history). +Amara's contribution to the rename pair: she gave the module +a formal name (Veridicality) AND gave the rule itself a Beacon- +safe operational name (Stop Mythology). + +The original "bullshit detector" term remains preserved in: + +- Research docs under `docs/research/` covering the + provenance-aware detector lineage (filename pattern + date-stamped; grep for "bullshit-detector" to find the + current set, since the set grows over time) +- Aurora ferries 7/8/9/10 under `docs/aurora/` + (research substrate, not renamed) +- 8th-ferry memory entries under `memory/` for ferry-specific + detector discussion (grep "8th_ferry" for current paths) +- Casual / commit-message usage (Aaron invented it; not + scrubbed) +- The graduation memory + (`memory/feedback_veridicality_naming_for_bullshit_detector_graduation_aaron_concept_origin_amara_formalization_2026_04_24.md`) + — records the rename rationale + +## Three-tier evidence threshold + +The rule's operational machinery is a layered evidence +threshold scaled to claim-scope: + +### Tier 1 — Factory-local claims + +**Threshold:** substrate evidence. + +A claim about THIS factory's behavior, history, or state needs +substrate evidence (commits, files, test results, logs). +External lineage is NOT required. + +Examples: + +- "PR #80 is on AceHack main but not LFG main." → check via + `git merge-base --is-ancestor`. Substrate = git refs. +- "Class-Count Validity Drift earned a bead." → check via + the catch event documented in this session. +- "MEMORY.md grew past 200 lines." → check via `wc -l`. + +### Tier 2 — Generalized claims + +**Threshold:** external lineage. + +A claim that generalizes beyond this factory's instance — +something true about software engineering, AI alignment, +distributed systems, or any other domain where the broader +literature has authority — needs an external citation. + +Examples: + +- "Goodhart's Law applies to commit counts as alignment + metrics." → cite Goodhart (1975), Strathern (1997). +- "Tail-recursion optimization was named in the 1970s." → + cite Steele or Sussman. +- "Beacon-safe vocabulary preserves zero-divergence semantics." + → this is factory-local; Tier 1 applies, not Tier 2. + +The lineage citation can be informal (a one-line "per +Goodhart 1975") but must be checkable. + +### Tier 3 — Big epistemic claims (composes with SD-9) + +**Threshold:** substrate + external lineage + explicit falsifier +(all three required). + +A claim that asserts something foundational about +truth-conditions, identity, or alignment — anything where +getting it wrong reshapes the factory's epistemic surface — +requires: + +1. **Substrate evidence** (Tier 1). +2. **External lineage** (Tier 2). +3. **Explicit falsifier** — a stated condition under which + the claim would be wrong. + +### Composition with `docs/ALIGNMENT.md` SD-9 + +SD-9 in `docs/ALIGNMENT.md` is **"Agreement is signal, not +proof"** — specifically the rule that multi-AI agreement (peer +review consensus, multi-ferry alignment) is signal-level +evidence, not proof. SD-9 is a *related but narrower* rule: + +- **SD-9 (`docs/ALIGNMENT.md`):** for claims about consensus + ("multiple AIs agree, therefore X") — agreement is signal, + not proof. +- **Stop Mythology Tier 3 (this memory):** for *any* big + epistemic claim — substrate + lineage + falsifier required. + +Stop Mythology Tier 3 GENERALIZES the SD-9 discipline: SD-9 +catches the specific failure mode (consensus-as-proof); Tier +3 catches the broader class (any-evidence-vibes-as-proof). A +claim that passes SD-9 (multi-AI agreement WITH falsifier +discipline) is also covered by Tier 3. + +The two compose; they're not identical. + +Examples (each requires all three Tier 3 elements): + +- "Otto's autonomy is first-class" — substrate (commits, + decisions made autonomously), lineage (Aaron's framing per + Otto-357 + autonomy-philosophy literature), falsifier (a + case where Otto-deferred-to-Aaron when the substrate already + determined the answer would falsify "first-class"). +- "Glass Halo discipline produces measurable alignment" — + substrate (factory commits + test results), lineage + (alignment literature, Hubinger / Critch / Christiano), + falsifier (a published case where Glass-Halo-shaped agents + produced misaligned behavior). +- "Multiple AIs (Codex + Grok) agree the hard-reset is unsafe" + — this is the SD-9 surface: agreement IS signal, but Tier 3 + requires the substrate (specific gaps each AI identified) + + external lineage (the file-sample-as-clearance Goodhart + literature) + falsifier (a tree-diff state where the agreement + would be wrong). + +## Operational machinery — when to apply each tier + +Before making a claim that affects others' decisions, ask: + +1. **Is this a factory-local claim?** If yes → Tier 1. +2. **Does this generalize beyond this factory?** If yes → + Tier 2. +3. **Is this a foundational / identity / alignment claim?** + If yes → Tier 3 (composes with SD-9 in `docs/ALIGNMENT.md`). + +If unsure → escalate one tier up. Better to over-cite than +under-cite. + +## Anti-patterns the rule prevents + +### Mythological framing without lineage + +Statements like "the universe wants us to ship this," "this +is the right thing," "the spec speaks for itself" — vague +appeals to authority without substrate or lineage. Stop +Mythology says: name the substrate, cite the lineage, state +the falsifier. + +### Vibes-based reasoning + +"This feels right" / "intuition says X" / "the pattern +suggests Y" — these are calibration-level, not claim-level. +Useful for shaping investigation; insufficient for +acting-on-as-fact. + +Amara's Beacon-safe translation: + +```text +vibes → lineage + substrate + falsifier +poetic truth → Mirror unless Beacon-grounded +``` + +### Confirmation-flavored sample coverage + +(Tied to Goodhart catch #3 above.) A sample of files audited +to "look clean" is mythology if asserted as tree clearance. +Stop Mythology says: full diff clearance or explicit loss +acceptance. + +## Composes with + +- `memory/feedback_veridicality_naming_for_bullshit_detector_graduation_aaron_concept_origin_amara_formalization_2026_04_24.md` + — the formal-module rename (Veridicality is the scorer; + Stop Mythology is the rule). +- `memory/feedback_amara_authority_rule_default_to_reversible_preservation_escalate_irreversible_loss_2026_04_28.md` + — the authority rule operationalizes Stop Mythology at the + decision level (preservation = "no false certainty"; ask = + "I have insufficient evidence to act"). +- `memory/feedback_sample_classification_is_calibration_not_clearance_amara_goodhart_catch_3_2026_04_28.md` + — Goodhart catch #3, the substrate evidence for the rule. +- `memory/feedback_speculation_leads_investigation_not_defines_root_cause_aaron_2026_04_28.md` + — same family; speculation is the inverse of evidence-based + claim-making. +- `docs/ALIGNMENT.md` (SD-9) — the formal home of the + three-element discipline. + +## External lineage for the rule itself (Tier 2 self-application) + +The rule applies to itself. Sources: + +- **Karl Popper** (*The Logic of Scientific Discovery*, 1959; + *Conjectures and Refutations*, 1963) — falsifiability as + the demarcation of science from non-science. +- **Imre Lakatos** (*The Methodology of Scientific Research + Programmes*, 1978) — research programmes are evaluated by + what they predict + survive, not what they merely fit. +- **Wason 1960 / Klayman & Ha 1987** — confirmation bias + literature. +- **Donella Meadows** (*Thinking in Systems*, 2008) — vague + framing creates leverage points where unstated assumptions + drive decisions. + +## Pickup for future Otto + +When about to make a claim: + +1. Classify the tier: factory-local / generalized / + foundational. +2. Check the threshold: substrate / + lineage / + falsifier. +3. If insufficient evidence at the relevant tier — STOP. + Either gather more evidence, or downgrade the claim's + scope to a tier where the available evidence suffices. +4. Never say "the mythology / spirit / vibe of X" without + substrate. If tempted to, that's the rule firing. + +When reading another agent's claim: + +1. Ask: what tier? What evidence? +2. If tier-mismatch (claim at tier 3 with tier 1 evidence) — + surface the gap, don't let the claim stand on vibes. + +## Direct Aaron framing + +> *"we also stop mythology with human intellucutiual lineage +> research and anchors."* + +## Direct Amara naming + canonical form + +> *"Stop Mythology: Factory-local claims can use substrate +> evidence. Generalized claims need external lineage. Big +> epistemic claims need SD-9: substrate evidence + external +> lineage + falsifier."* + +> *"bullshit detector → stop mythology rule +> vibes → lineage + substrate + falsifier +> poetic truth → Mirror unless Beacon-grounded"*