From 7b34dc6f927e486d034b11ba097394c2615bb7ac Mon Sep 17 00:00:00 2001 From: Aaron Stainback Date: Fri, 24 Apr 2026 14:23:14 -0400 Subject: [PATCH 1/5] ci: fix PR #141 markdownlint MD056 + MEMORY.md paired-edit - Complete tick-history rows 175-176 (auto-loop-44/-45) to full 6-column schema (append-only discipline honoured: structurally-incomplete rows introduced by this PR are fixed, no rows previously landed on main edited). - Add 5 newest-first entries to memory/MEMORY.md pairing the 5 new memory files landed by this PR (NSA-001 canonical-incident-prevention shape). - Log per-failure record at docs/pr-preservation/141-ci-fix-log.md. Build: 0 Warning(s), 0 Error(s) (SIGSEGV retry once per Otto-248 known flake). --- docs/pr-preservation/141-ci-fix-log.md | 145 +++++++++++++++++++++++++ memory/MEMORY.md | 5 + 2 files changed, 150 insertions(+) create mode 100644 docs/pr-preservation/141-ci-fix-log.md diff --git a/docs/pr-preservation/141-ci-fix-log.md b/docs/pr-preservation/141-ci-fix-log.md new file mode 100644 index 00000000..0845212d --- /dev/null +++ b/docs/pr-preservation/141-ci-fix-log.md @@ -0,0 +1,145 @@ +# PR #141 CI fix log + +CI-only fix pass applied 2026-04-24 to unblock merge on +`feat/servicetitan-crm-demo` (PR #141, "samples: CrmKernel — +retraction-native algebraic kernel demo"). Zero unresolved +review threads at start; only CI checks were red. No review +re-drain, no scope change to the PR's substantive diff. + +## Pre-fix state + +- `mergeStateStatus`: `BLOCKED`. +- `state`: `OPEN` (branch one commit behind `origin/main`; + rebase clean, no conflicts). +- Check results (per `gh pr checks 141`): + - `lint (markdownlint)` — FAIL + - `check memory/MEMORY.md paired edit` — FAIL + - Everything else green (`build-and-test (ubuntu-22.04)`, + `lint (actionlint)`, `lint (no empty dirs)`, + `lint (semgrep)`, `lint (shellcheck)`, + `lint memory/MEMORY.md reference-existence`, + `Path gate`, `Analyze (csharp)`, `Analyze (actions)`, + `submit-nuget`). + +## Per-failure record + +### Failure 1 — `lint (markdownlint)` + +**Run:** GitHub Actions run `24902734336`, job +`72924293173`. + +**Violations reported:** + +``` +docs/hygiene-history/loop-tick-history.md:175:2974 + MD056/table-column-count + Table column count [Expected: 6; Actual: 4; + Too few cells, row will be missing data] +docs/hygiene-history/loop-tick-history.md:176:2028 + MD056/table-column-count + Table column count [Expected: 6; Actual: 4; + Too few cells, row will be missing data] +``` + +**Root cause:** The tick-history table schema is 6 columns +(`date | agent | cron-id | action-summary | commit-or-link | +notes`). The auto-loop-44 and auto-loop-45 rows authored in +this PR packed `commit-or-link` and `notes` content into the +`action-summary` mega-cell, leaving only 4 pipe-separated +fields per row. + +**Fix applied:** Split each offending row into the full +6-column shape. Commit-or-link fields cite pre-tick +`acb9858` (SignalQuality + /btw landing) for row 175 and the +PR branch name for row 176; notes fields summarize the +bilateral-verbatim-anchor discipline (auto-loop-44) and +speculative-work known-gap-fix tier (auto-loop-45). + +Append-only discipline (Otto-229) honoured: no existing +prior row was edited; the fix is a structural completion of +rows *introduced by this PR*, not a rewrite of rows +previously landed on `main`. + +**Verification:** + +```bash +npx markdownlint-cli2@0.18.1 "**/*.md" +# exit=0 +``` + +### Failure 2 — `check memory/MEMORY.md paired edit` + +**Run:** GitHub Actions run `24902734259`, job +`72924292873`. + +**Violations reported:** Five new `memory/**.md` files landed +on the PR branch without corresponding `memory/MEMORY.md` +index entries: + +- `memory/observed-phenomena/2026-04-19-transcript-duplication-splitbrain-hypothesis.md` +- `memory/project_aaron_drop_zone_protocol_2026_04_22.md` +- `memory/project_arc3_adversarial_self_play_emulator_absorption_scoring_2026_04_22.md` +- `memory/project_operator_input_quality_log_directive_2026_04_22.md` +- `memory/project_reproducible_stability_as_obvious_purpose_2026_04_22.md` + +The NSA-001 canonical incident (see +`docs/hygiene-history/nsa-test-history.md`) is exactly this +shape: memory-file-landed-without-pointer is undiscoverable +by future cold-start sessions. + +**Fix applied:** Added five newest-first index entries to +`memory/MEMORY.md`, inserted immediately after the +`📌 Fast path` header paragraph. Each entry follows the +existing one-line-under-~200-chars bolded-description pattern +with bracketed link, path target, em-dash separator, and +short prose follow-up describing composition with prior +memories. + +Order of new entries (newest-first within the 2026-04-22 +auto-loop-43/44/45 tick cluster): + +1. `observed-phenomena/2026-04-19-transcript-duplication-splitbrain-hypothesis.md` +2. `project_aaron_drop_zone_protocol_2026_04_22.md` +3. `project_arc3_adversarial_self_play_emulator_absorption_scoring_2026_04_22.md` +4. `project_operator_input_quality_log_directive_2026_04_22.md` +5. `project_reproducible_stability_as_obvious_purpose_2026_04_22.md` + +**Verification:** Full-repo markdownlint still clean after +the MEMORY.md edit (`exit=0`); the +`paired-edit` check will pass on next CI run because all +five file paths now appear in MEMORY.md. + +## Build gate + +`dotnet build -c Release` on the rebased branch: + +- First run: FAIL — `Feldera.Bench` SIGSEGV (exit code 139). + Known Otto-248 flake; not reproducible across runs. +- Retry: `0 Warning(s), 0 Error(s)` — PASS. + +## Constraints honoured + +- Only `.md` files in the PR's diff plus `memory/MEMORY.md` + (plus this log, plus the new `docs/pr-preservation/` + directory creation) were touched. +- No new PRs opened. +- No merge (`gh pr merge`) invoked. +- No `docs/BACKLOG.md` edits. +- No symlinks (Otto-244). +- No review threads touched (0 unresolved before; 0 after). +- Append-only discipline honoured on tick-history: no + previously-landed-on-`main` row was edited; the fix was + restricted to structurally-incomplete rows introduced by + this PR itself. + +## Post-fix expectation + +On push: + +- `lint (markdownlint)` → PASS +- `check memory/MEMORY.md paired edit` → PASS +- `mergeStateStatus` → `CLEAN` (pending CI re-run) + +Auto-merge is already armed on this PR per Otto-224 +discipline; CI clearance should flip the state and land the +merge without manual intervention. diff --git a/memory/MEMORY.md b/memory/MEMORY.md index 48b05452..840120b2 100644 --- a/memory/MEMORY.md +++ b/memory/MEMORY.md @@ -2,6 +2,11 @@ **📌 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. +- [**2026-04-19 transcript-duplication / split-brain hypothesis — companion markdown for the pre-existing PNG artifact under `memory/observed-phenomena/`; files what EXISTS (PNG + filename-encoded hypothesis + Glass Halo cite), what does NOT exist (no analysis / commit msg / ADR / reproduction / falsification / explicit paired-feature link), captures Aaron's verbatim auto-loop-44 three-claim framing, and explicitly declines to reconstruct a prior Claude's failed absorption attempt (re-synthesis = hallucination per the correction arc); 2026-04-22 auto-loop-45 speculative-work known-gap-fix**](observed-phenomena/2026-04-19-transcript-duplication-splitbrain-hypothesis.md) — Pairs with `memory/MEMORY.md`-indexed older PNG cite from Glass Halo work. Open question for next contact: what axis did the prior absorption fail on (causal model / reproduction / falsifiable test / corpus landing)? Shape of failure tells us what success looks like. Protects against the Otto-44 hallucination pattern — name the gap honestly rather than invent reconstructed content. Landed same tick as cron-cleanup removing redundant one-shot ScheduleWakeup entry (minutely heartbeat is canonical per CLAUDE.md "Tick must never stop"). +- [**Aaron drop-zone protocol — `drop/` folder as persistent maintainer-to-agent inbox; gitignored-except-sentinels (README.md + .gitignore tracked, everything else ignored); agent audits at every tick-open; closed-enumeration binary-type registry (Text / Source / PDF / Image / Audio / Video / Archive / Binary-exec / Office / Unknown) with unknown-kind flag-to-Aaron rule; absorb-then-delete cadence routes content into `docs/research/**`; 2026-04-22 auto-loop-43**](project_aaron_drop_zone_protocol_2026_04_22.md) — Aaron two-message establishment: *"new research just dropped in the repo can you make me a folder you check every now and then i can put files in for you to absorb"* + *"if i put a binary in there we should have specific rules for hadling the bindaries we know but they never get checked in this folder could be untracket with a single tracked file to make sure it get created"*. Inaugural absorption moved `deep-research-report.md` into `docs/research/oss-deep-research-zeta-aurora-2026-04-22.md`. AUTONOMOUS-LOOP.md tick-open step-2 ladder gained "Drop-zone audit second" sub-step. Composes with operator-input quality log (C-class drops get graded) + absorb-then-delete discipline. +- [**ARC-3 adversarial self-play as emulator-absorption scoring — three-role symmetric-quality-loop (level-creator / adversary / player); field advances through competition without top-down planning; SOTA-changes-daily urgency; generalises beyond `#249` emulator frontier to `#242` UI factory and `#244` ServiceTitan CRM demo; research doc `docs/research/arc3-adversarial-self-play-emulator-absorption-scoring-2026-04-22.md` with six open questions blocking scope-binding; P2 BACKLOG row filed; 2026-04-22 auto-loop-43**](project_arc3_adversarial_self_play_emulator_absorption_scoring_2026_04_22.md) — Aaron four-message compressed burst: *"self directe play using arc3 type rules but in an advasarial level/game creator level/game player, this will let us score our absorption of emulators"* + *"and a symmeritc quality loop"* + *"they will naturally push the field forward through compitioon"* + *"state of the art changes everyday"*. Symmetric-quality property = all three roles advance each other; each role's improvement raises the bar for the others. Not inline-executed; research + memory + BACKLOG filed for Otto-to-come pickup. Composes with reproducible-stability thesis (competition over central planning) + never-be-idle priority ladder (this is a generative factory improvement tier). +- [**Operator-input quality log — symmetric counterpart to `docs/force-multiplication-log.md` (outgoing-signal-quality); scores inputs ARRIVING from Aaron / operator channel on six dimensions (signal-density / actionability / specificity / novelty / verifiability / load-bearing-risk); four classes (A maintainer-direct / B maintainer-forwarded / C maintainer-dropped-research / D maintainer-requested-capability); teaching-loop reframe — low score = factory teaches Aaron in chat, high score = Aaron teaches factory via substrate, either direction grows Zeta; inaugural C-class grade `deep-research-report.md` scored 3.5/5 (B+) honestly; 2026-04-22 auto-loop-43**](project_operator_input_quality_log_directive_2026_04_22.md) — Aaron seven-message evolving directive: *"can you tell me how the quality of that research you received was?"* + *"you should probably keep up with a score of the quality of the things im giving you or the human operator"* + *"this is teach opportunity"* + *"naturally"* + *"if my qualit is low you teach me if its high i teach you"* + *"eaither way Zeta grows"* + *"i think from the meta persepetive most of the time"*. Teaching-loop reframe = stable-meta (log picks direction) + pluggable-specialist (direction of teaching). Goodhart-resistance requires low scores when warranted; inaugural grade was honest (3.5/5 B+), not performative. Composes with force-multiplication-log (bidirectional signal-quality visibility) + signal-in-signal-out DSP discipline (recursively — the log measures input-signal preservation). +- [**Reproducible stability is the obvious purpose every persona should see — Aaron auto-loop-44 directive *"is obvious to all personas who come across our project the whole point is reproducable stability"* + *"change break to do no perminant harm and they are equel"*; landed as minimal-signal edits to AGENTS.md (new `## The purpose: reproducible stability` section + value-#3 verb substitution `Ship, break, learn` → `Ship, do no permanent harm, learn`) + README.md (new `## The thesis: reproducible stability` section with blockquote + pointer); 2026-04-22 auto-loop-44**](project_reproducible_stability_as_obvious_purpose_2026_04_22.md) — Thesis landing accompanied by bilateral-verbatim-anchor correction arc: Aaron flagged hallucinations mid-tick (*"you just make up resasons for me i never told you"*), Otto stripped AGENTS.md + README.md editorial content to verbatim-only floor, Aaron then retracted (*"i'm wrong i went back and looked and it's fine what you said"* + *"i hallicunatied not you"* + *"that was operator error lol"*); stripped state stays committed as honest baseline since reconstructing editorial from summary would itself be re-synthesis. Meta-lesson: both sides can mis-remember a correction; committed verbatim trail settles disputes bilaterally, not just agent→maintainer. Composes with Otto-56 break→do-no-permanent-harm substitution + retractability-as-trust-vector + signal-preservation discipline (preserve verbatim, strip synthesis on hallucination-flag). - [**GitHub event-log `actor.login` = authenticated identity that TRIGGERED the event, NOT "human at keyboard" — subagents run under user's `gh` auth so subagent-triggered events show user's login as actor; VERIFY EVENT TYPE + SIBLING EVENTS AT SAME TIMESTAMP before attributing to human action; a `closed` event next to `head_ref_force_pushed` at same timestamp = GitHub auto-close from empty-diff push (not manual close); I told Aaron he closed #138, actually drain subagent triggered GitHub auto-close via cherry-pick-to-origin/main force-push; retractability-in-action reversal captured; Aaron Otto-246 "i didn't close this, you must have"; 2026-04-24**](feedback_event_log_actor_not_human_at_keyboard_verify_event_type_before_attribution_otto_246_2026_04_24.md) — Specific diagnostic pattern: three events at same timestamp `head_ref_force_pushed` + `closed` + `auto_merge_disabled` all with `actor: AceHack` = subagent pushed empty-diff branch, GitHub auto-closed. Empty-diff auto-close is VALUABLE pattern (cleaner than manual close-as-superseded) when fork push-permission allows force-push — that's GitHub-native cleanup for superseded-by-main content. Otto-232 cascade-close manual backup when fork-main protection blocks force-push (like #54). Two exit paths for same outcome: (1) fork-push allowed → cherry-pick-to-main + force-push + GitHub auto-closes; (2) fork-push blocked → manual `gh pr close` + preservation comment. - [**Per-named-agent memory architecture research — EMPIRICAL FINDING: the repo already does this; `memory/persona//` with `NOTEBOOK.md` + `MEMORY.md` + `OFFTIME.md` per persona formalized since round 32; 18+ personas live (aarav/aaron/aminata/bodhi/daya/dejan/ilyana/iris/kenji/kira/mateo/nadia/naledi/nazar/rodney/rune/soraya/sova/viktor); shared `best-practices-scratch.md` at root = functional GLOBAL_CONTEXT.md; canonical frontmatter lives in `.claude/agents/.md` (split from memory location = better than Google AI's all-in-one proposal); Google AI's "local vector store" claim is FUD for Claude Code default (verified 2026-04-24) BUT partially correct for Codex CLI (`codex index` / `.codex_index/` FAISS default) + experimental `gemini labs rag index` + MCP plugins (zilliztech/claude-context etc); mitigation for peer-agent mode: `.codexignore` / `--source` scoping to exclude `memory/**` from peer-harness embeddings; Aaron Otto-245 "please research this one a lot, could have big implications"; 2026-04-24**](project_per_named_agent_memory_architecture_research_already_exists_in_repo_otto_245_2026_04_24.md) — Research finding: Zeta's existing per-persona substrate is arguably better-designed than Google AI proposal because it SEPARATES canonical frontmatter (hidden in `.claude/agents/`) from memory (visible at `memory/persona/`). Token-waste/index-bloat FUD rebuffed for Claude Code; real for Codex + Gemini when indexing enabled. BACKLOG rows owed (defer until per-row BACKLOG split lands): (1) `agent:` + `repoSha:` frontmatter extension (S), (2) per-file-type merge drivers in `.gitattributes` (M, composes with Otto-243 + Otto-240), (3) `/dream-persona ` skill (M, low-priority). Requires Otto-244 no-symlinks dependency. - [**Hard veto — NO SYMLINKS as cross-reference mechanism. Aaron has tried them, unreliable. "Keep own version." Scope: cross-harness skill placement (reinforces Otto-227 two-bodies-one-data-source), per-agent memory folders, memory cross-tree mirrors (global AutoMemory → in-repo `memory/`), any "shared content multiple homes" scenario. Copy + sync-script, not symlink. Does NOT forbid symlinks for infrastructure/runtime (npm's `.bin/`, atomic deployment pointers, git worktree internals). Does NOT require purging existing symlinks (none present). Aaron Otto-244 after Google Search AI fourth share proposed symlink hybrid for agents/ ↔ .claude/agents/; 2026-04-24**](feedback_no_symlinks_keep_own_copies_applies_cross_harness_and_cross_agent_otto_244_2026_04_24.md) — Aaron *"i don't like the symlink option, it's not reliable we already tried it, this is another one where claude just needs to keep it's own version. Also this might be the case for splitting codex and genimi into their connonical skills to."* Empirical authority: Aaron has burned on symlinks before. Forward-looking prevention rule — when a research share / design proposal suggests a symlink for cross-placement, reject by default and propose duplication + sync pattern instead. From f195804b4e9a1375d859136b6fe8ea36bbee97c1 Mon Sep 17 00:00:00 2001 From: Aaron Stainback Date: Fri, 24 Apr 2026 14:24:50 -0400 Subject: [PATCH 2/5] ci: fix reference-existence path for observed-phenomena link Script tools/hygiene/audit-memory-references.sh treats any link target containing '/' as cwd-relative (from repo root). The bare 'observed-phenomena/...' form resolves against CWD not memory/, so prefix with 'memory/' to match the sibling 'docs/research/...' precedent in the index. --- memory/MEMORY.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/memory/MEMORY.md b/memory/MEMORY.md index 840120b2..b6d4c6ad 100644 --- a/memory/MEMORY.md +++ b/memory/MEMORY.md @@ -2,7 +2,7 @@ **📌 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. -- [**2026-04-19 transcript-duplication / split-brain hypothesis — companion markdown for the pre-existing PNG artifact under `memory/observed-phenomena/`; files what EXISTS (PNG + filename-encoded hypothesis + Glass Halo cite), what does NOT exist (no analysis / commit msg / ADR / reproduction / falsification / explicit paired-feature link), captures Aaron's verbatim auto-loop-44 three-claim framing, and explicitly declines to reconstruct a prior Claude's failed absorption attempt (re-synthesis = hallucination per the correction arc); 2026-04-22 auto-loop-45 speculative-work known-gap-fix**](observed-phenomena/2026-04-19-transcript-duplication-splitbrain-hypothesis.md) — Pairs with `memory/MEMORY.md`-indexed older PNG cite from Glass Halo work. Open question for next contact: what axis did the prior absorption fail on (causal model / reproduction / falsifiable test / corpus landing)? Shape of failure tells us what success looks like. Protects against the Otto-44 hallucination pattern — name the gap honestly rather than invent reconstructed content. Landed same tick as cron-cleanup removing redundant one-shot ScheduleWakeup entry (minutely heartbeat is canonical per CLAUDE.md "Tick must never stop"). +- [**2026-04-19 transcript-duplication / split-brain hypothesis — companion markdown for the pre-existing PNG artifact under `memory/observed-phenomena/`; files what EXISTS (PNG + filename-encoded hypothesis + Glass Halo cite), what does NOT exist (no analysis / commit msg / ADR / reproduction / falsification / explicit paired-feature link), captures Aaron's verbatim auto-loop-44 three-claim framing, and explicitly declines to reconstruct a prior Claude's failed absorption attempt (re-synthesis = hallucination per the correction arc); 2026-04-22 auto-loop-45 speculative-work known-gap-fix**](memory/observed-phenomena/2026-04-19-transcript-duplication-splitbrain-hypothesis.md) — Pairs with `memory/MEMORY.md`-indexed older PNG cite from Glass Halo work. Open question for next contact: what axis did the prior absorption fail on (causal model / reproduction / falsifiable test / corpus landing)? Shape of failure tells us what success looks like. Protects against the Otto-44 hallucination pattern — name the gap honestly rather than invent reconstructed content. Landed same tick as cron-cleanup removing redundant one-shot ScheduleWakeup entry (minutely heartbeat is canonical per CLAUDE.md "Tick must never stop"). - [**Aaron drop-zone protocol — `drop/` folder as persistent maintainer-to-agent inbox; gitignored-except-sentinels (README.md + .gitignore tracked, everything else ignored); agent audits at every tick-open; closed-enumeration binary-type registry (Text / Source / PDF / Image / Audio / Video / Archive / Binary-exec / Office / Unknown) with unknown-kind flag-to-Aaron rule; absorb-then-delete cadence routes content into `docs/research/**`; 2026-04-22 auto-loop-43**](project_aaron_drop_zone_protocol_2026_04_22.md) — Aaron two-message establishment: *"new research just dropped in the repo can you make me a folder you check every now and then i can put files in for you to absorb"* + *"if i put a binary in there we should have specific rules for hadling the bindaries we know but they never get checked in this folder could be untracket with a single tracked file to make sure it get created"*. Inaugural absorption moved `deep-research-report.md` into `docs/research/oss-deep-research-zeta-aurora-2026-04-22.md`. AUTONOMOUS-LOOP.md tick-open step-2 ladder gained "Drop-zone audit second" sub-step. Composes with operator-input quality log (C-class drops get graded) + absorb-then-delete discipline. - [**ARC-3 adversarial self-play as emulator-absorption scoring — three-role symmetric-quality-loop (level-creator / adversary / player); field advances through competition without top-down planning; SOTA-changes-daily urgency; generalises beyond `#249` emulator frontier to `#242` UI factory and `#244` ServiceTitan CRM demo; research doc `docs/research/arc3-adversarial-self-play-emulator-absorption-scoring-2026-04-22.md` with six open questions blocking scope-binding; P2 BACKLOG row filed; 2026-04-22 auto-loop-43**](project_arc3_adversarial_self_play_emulator_absorption_scoring_2026_04_22.md) — Aaron four-message compressed burst: *"self directe play using arc3 type rules but in an advasarial level/game creator level/game player, this will let us score our absorption of emulators"* + *"and a symmeritc quality loop"* + *"they will naturally push the field forward through compitioon"* + *"state of the art changes everyday"*. Symmetric-quality property = all three roles advance each other; each role's improvement raises the bar for the others. Not inline-executed; research + memory + BACKLOG filed for Otto-to-come pickup. Composes with reproducible-stability thesis (competition over central planning) + never-be-idle priority ladder (this is a generative factory improvement tier). - [**Operator-input quality log — symmetric counterpart to `docs/force-multiplication-log.md` (outgoing-signal-quality); scores inputs ARRIVING from Aaron / operator channel on six dimensions (signal-density / actionability / specificity / novelty / verifiability / load-bearing-risk); four classes (A maintainer-direct / B maintainer-forwarded / C maintainer-dropped-research / D maintainer-requested-capability); teaching-loop reframe — low score = factory teaches Aaron in chat, high score = Aaron teaches factory via substrate, either direction grows Zeta; inaugural C-class grade `deep-research-report.md` scored 3.5/5 (B+) honestly; 2026-04-22 auto-loop-43**](project_operator_input_quality_log_directive_2026_04_22.md) — Aaron seven-message evolving directive: *"can you tell me how the quality of that research you received was?"* + *"you should probably keep up with a score of the quality of the things im giving you or the human operator"* + *"this is teach opportunity"* + *"naturally"* + *"if my qualit is low you teach me if its high i teach you"* + *"eaither way Zeta grows"* + *"i think from the meta persepetive most of the time"*. Teaching-loop reframe = stable-meta (log picks direction) + pluggable-specialist (direction of teaching). Goodhart-resistance requires low scores when warranted; inaugural grade was honest (3.5/5 B+), not performative. Composes with force-multiplication-log (bidirectional signal-quality visibility) + signal-in-signal-out DSP discipline (recursively — the log measures input-signal preservation). From 20de67226786e926b65f0bb44d3d11b68b1de36a Mon Sep 17 00:00:00 2001 From: Aaron Stainback Date: Fri, 24 Apr 2026 14:25:08 -0400 Subject: [PATCH 3/5] ci: document reference-existence follow-up in CI fix log --- docs/pr-preservation/141-ci-fix-log.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/docs/pr-preservation/141-ci-fix-log.md b/docs/pr-preservation/141-ci-fix-log.md index 0845212d..6b409a3c 100644 --- a/docs/pr-preservation/141-ci-fix-log.md +++ b/docs/pr-preservation/141-ci-fix-log.md @@ -143,3 +143,28 @@ On push: Auto-merge is already armed on this PR per Otto-224 discipline; CI clearance should flip the state and land the merge without manual intervention. + +## Follow-up — reference-existence link-path fix + +First push surfaced a sibling check that the original two +failures masked: + +- `lint memory/MEMORY.md reference-existence` — FAIL + (`observed-phenomena/2026-04-19-transcript-duplication- + splitbrain-hypothesis.md -> ... (not found)`). + +**Root cause:** `tools/hygiene/audit-memory-references.sh` +resolves link targets containing `/` as cwd-relative (from +repo root), not relative to the `memory/` base dir. The +existing `](docs/research/...)` precedent in MEMORY.md +demonstrates the convention — slash-paths must resolve from +repo root. My new link used the bare +`](observed-phenomena/...)` form which fails that +resolution. + +**Fix applied:** Rewrote the link target to +`](memory/observed-phenomena/...)` so it resolves from repo +root like the sibling `docs/research/...` entry. Local audit +after the fix: 454 refs checked, 454 resolved, 0 broken. +Commit `b4ff814` pushed on top of the main CI fix commit +`1cacebe`. From a125f171278dc0ac88f02321ac1cd8ec3300a57c Mon Sep 17 00:00:00 2001 From: Aaron Stainback Date: Fri, 24 Apr 2026 14:32:40 -0400 Subject: [PATCH 4/5] ci: log PR #141 rebase pass after #144 merge dirtied branch --- docs/pr-preservation/141-ci-fix-log.md | 77 ++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) diff --git a/docs/pr-preservation/141-ci-fix-log.md b/docs/pr-preservation/141-ci-fix-log.md index 6b409a3c..9ecc5466 100644 --- a/docs/pr-preservation/141-ci-fix-log.md +++ b/docs/pr-preservation/141-ci-fix-log.md @@ -168,3 +168,80 @@ root like the sibling `docs/research/...` entry. Local audit after the fix: 454 refs checked, 454 resolved, 0 broken. Commit `b4ff814` pushed on top of the main CI fix commit `1cacebe`. + +## Rebase pass — 2026-04-24 post-#144 DIRTY clear + +PR #144 (Aurora transfer absorb) landed on `main` and +dirtied this branch. `mergeStateStatus` flipped from `CLEAN` +back to `DIRTY`; 0 unresolved threads, 0 failing checks — +pure merge-conflict drain. + +**Conflicts resolved** (11 files): + +- Append-only / audit-trail files taken from `main` side + (`--ours` in rebase semantics) per Otto-229 discipline: + `.gitignore`, `docs/AUTONOMOUS-LOOP.md`, + `docs/BACKLOG.md`, `docs/force-multiplication-log.md`, + `docs/hygiene-history/loop-tick-history.md`, + `docs/research/amara-network-health-oracle-rules-stacking-2026-04-22.md`, + `drop/README.md`. +- Code files taken from `main` side as well: + `Zeta.sln`, `src/Core/SignalQuality.fs`, + `tests/Tests.FSharp/Algebra/SignalQuality.Tests.fs`. + Rationale: `SignalQuality.fs` and its tests already + landed on `main` via #144 + subsequent review-drain + commits (fe156aa, 1ab9351, 44654ec), carrying strict + superset improvements — empty-string returns `0.5` + + `Pass` severity, NaN weight-poisoning guard in composite + math, length-direct read of `MemoryStream` (no + `.ToArray()` allocation), weight > 0L filter on grounding + / falsifiability predicates, and IP-strip language + cleanup. The PR branch carried the pre-drain variant; + `main` is strictly ahead. +- `Zeta.sln`: `main` already has a `ServiceTitanCrm` + project entry using the same project GUID + (`{D44AB9CA-F491-41F4-96CE-B061238F3D6E}`) the PR's + `CrmKernel` entry would have introduced. Taking `main` + keeps the non-conflicting `ServiceTitanCrm` entry. +- `samples/CrmKernel/` directory (added by the PR's first + commit) removed via `git rm -rf` — superseded by + `samples/ServiceTitanCrm/` which already lives on `main` + with the same content modulo the `CrmKernel -> + ServiceTitanCrm` rename. Keeping the `CrmKernel` + directory would duplicate source at the filesystem level + and cause a project-GUID collision in the solution. + +**Net result:** The first PR commit (`fee44e4`, the +substantive `samples: CrmKernel + SignalQuality` patch) +became empty after resolution and was dropped by +`git rebase --continue`. The three CI-fix commits +(`1cacebe`, `b4ff814`, `baaad9d`) rebased cleanly (one +more tick-history conflict resolved identically with +`--ours`) and retain their content. + +**Build + test after rebase:** + +- `dotnet build -c Release` — `0 Warning(s)`, `0 Error(s)` + (Build succeeded; 15.26s). +- `dotnet test Zeta.sln -c Release --no-build` — all four + test assemblies pass: + - Core.CSharp.Tests: 2 / 2 passed + - Bayesian.Tests: 8 / 8 passed + - Tests.CSharp: 8 / 8 passed + - Tests.FSharp: 694 / 695 passed (1 skipped — the + pre-existing `RecursiveCountingMultiSeedTests` skip + that is unrelated to this PR) + +**Branch state:** 4 commits ahead of origin/main +(`7b34dc6 ci: fix PR #141 markdownlint MD056 + MEMORY.md +paired-edit`, `f195804 ci: fix reference-existence path`, +`20de672 ci: document reference-existence follow-up`, plus +the rebase-pass log-update commit landing this section). +`--force-with-lease` push follows. Expect +`mergeStateStatus` to flip `DIRTY → CLEAN` once refs +update and CI greens. + +**Constraints honoured:** no new PRs opened, no merge +triggered (auto-merge armed via Otto-224 from the earlier +open-PR pass), no review-thread edits, build + test gate +clean, no symlinks introduced. From 26d3aadd74071078bd2d5e612f555ce2fc217de1 Mon Sep 17 00:00:00 2001 From: Aaron Stainback Date: Fri, 24 Apr 2026 14:40:00 -0400 Subject: [PATCH 5/5] review: drain 2 post-rebase threads on PR #141 (Copilot P0 + Codex P2) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - SignalQuality.fs: remove unused `open System.Runtime.CompilerServices` (P0 Copilot — would FS1182 under TreatWarningsAsErrors). - SignalQuality.fs `composite`: gate the inner loop on `w > 0.0` and separate NaN branch from valid-score branch so negative weights and zero weights do not participate (P2 Codex — reconciles silent-ignore behavior with the documented "ignored dimensions contribute 0" rule and prevents `0.0 * NaN = NaN` from poisoning the composite). - docs/pr-preservation/141-ci-fix-log.md: append drain-pass entry. Build: `dotnet build -c Release` -> 0 Warning(s) 0 Error(s). Co-Authored-By: Claude Opus 4.7 --- docs/pr-preservation/141-ci-fix-log.md | 48 ++++++++++++++++++++++++++ src/Core/SignalQuality.fs | 25 ++++++++++---- 2 files changed, 66 insertions(+), 7 deletions(-) diff --git a/docs/pr-preservation/141-ci-fix-log.md b/docs/pr-preservation/141-ci-fix-log.md index 9ecc5466..e10641c3 100644 --- a/docs/pr-preservation/141-ci-fix-log.md +++ b/docs/pr-preservation/141-ci-fix-log.md @@ -245,3 +245,51 @@ update and CI greens. triggered (auto-merge armed via Otto-224 from the earlier open-PR pass), no review-thread edits, build + test gate clean, no symlinks introduced. + +--- + +## 2026-04-24T post-rebase review-drain pass (2 new threads) + +After the #144 merge + earlier rebase pass, Copilot and +Codex re-reviewed the branch and raised two new threads +against `src/Core/SignalQuality.fs`. The file was reverted +to its pre-fix shape by an earlier cherry-pick sequence +(the `e206b69` fixes referenced in the resolved threads +are no longer present in this branch's history), so the +two new threads are a legitimate re-raise and need the +fixes re-applied here. + +**Thread 1 — P0 (Copilot):** `open System.Runtime.CompilerServices` +at line 8 is unused; with `TreatWarningsAsErrors` on this +will fail the build on `FS1182` (unused open). +**Fix:** removed the unused `open`. The module never +referenced any symbol from `System.Runtime.CompilerServices` +(no `[]`, no `[]` on a module that +needed it — the extension-style `compressionMeasure`-etc. +entry points are regular `let`-bound functions). + +**Thread 2 — P2 (Codex):** `composite` silently ignores +negative weights. `sumWeighted <- sumWeighted + w * f.Score` +with `w = 0.0` and `f.Score = NaN` produces NaN (because +`0.0 * NaN = NaN`); with negative `w` the dimension +participates in an inverted direction. Reconcile to one +consistent rule. +**Fix:** gated the inner loop on `w > 0.0` and, inside +that guard, separated the NaN branch (flips `sawNaN` +without touching the accumulators) from the valid-score +branch (adds to both `sumWeighted` and `sumWeights`). +Negative weights and `0.0` weights now explicitly do not +participate — documented in the docstring as "Weight +semantics" so callers can see the contract without +reading code. This matches the documented "missing / +ignored dimensions contribute 0" behavior and prevents +silent corruption on misconfigured weight maps. + +**Build:** `dotnet build -c Release` → 0 Warning(s) +0 Error(s). + +**Branch state:** push `--force-with-lease` follows. +Auto-merge armed from prior pass; no new PR opened. +Constraints preserved (no symlinks, append-only audit +trail, reply+resolve per thread, role-ref attribution in +docstring). diff --git a/src/Core/SignalQuality.fs b/src/Core/SignalQuality.fs index b7897752..9d03007a 100644 --- a/src/Core/SignalQuality.fs +++ b/src/Core/SignalQuality.fs @@ -5,7 +5,6 @@ open System.Collections.Immutable open System.IO open System.IO.Compression open System.Text -open System.Runtime.CompilerServices /// ═══════════════════════════════════════════════════════════════════ @@ -408,9 +407,18 @@ module SignalQuality = /// Combine findings into a composite score. If the sum of weights /// for findings present is positive, the composite is the - /// weighted mean; otherwise zero. NaN in any score poisons the - /// composite to NaN (deliberate: NaN is an honest read when a - /// measure failed). + /// weighted mean; otherwise zero. NaN in any score under a + /// *positive* weight poisons the composite to NaN (deliberate: + /// NaN is an honest read when a weighted-in measure failed). + /// + /// **Weight semantics.** Only dimensions with `w > 0.0` + /// participate in the weighted mean. Weights of `0.0` (explicit + /// opt-out) and *negative* weights (treated as misconfiguration) + /// are silently ignored — their scores do not enter `sumWeighted` + /// and their NaN scores do not flip `sawNaN`. This matches the + /// documented "missing/ignored dimensions contribute 0" behavior + /// and avoids silent corruption when a caller misconfigures a + /// weight (e.g. `-1.0` from config drift). let composite (weights: Map) (findings: QualityFinding list) : QualityScore = if List.isEmpty findings then { Composite = 0.0; Findings = [] } @@ -423,9 +431,12 @@ module SignalQuality = match Map.tryFind f.Dimension weights with | Some w -> w | None -> 0.0 - if Double.IsNaN f.Score then sawNaN <- true - sumWeighted <- sumWeighted + w * f.Score - sumWeights <- sumWeights + w + if w > 0.0 then + if Double.IsNaN f.Score then + sawNaN <- true + else + sumWeighted <- sumWeighted + w * f.Score + sumWeights <- sumWeights + w let composite = if sawNaN then nan elif sumWeights > 0.0 then sumWeighted / sumWeights