Skip to content

backlog(B-0109,P0): dependency status tracking surface — Aaron 2026-04-30 urgent + live GitHub PR-degradation evidence#912

Merged
AceHack merged 6 commits intomainfrom
ops/backlog-dependency-status-tracking-2026-04-30
Apr 30, 2026
Merged

backlog(B-0109,P0): dependency status tracking surface — Aaron 2026-04-30 urgent + live GitHub PR-degradation evidence#912
AceHack merged 6 commits intomainfrom
ops/backlog-dependency-status-tracking-2026-04-30

Conversation

@AceHack
Copy link
Copy Markdown
Member

@AceHack AceHack commented Apr 30, 2026

Summary

P0 backlog row landing Aaron's ask for a dependency-status
tracking surface. Escalated from P1 to P0 on Aaron's urgency
clarification and on live evidence found while filing.

Live evidence (2026-04-30T~11:14Z): GitHub status API
shows an ACTIVE incident — "Incomplete pull request results
in repositories"
— ongoing since 03:49:37Z. Pull Requests
component flagged `degraded_performance`. The factory had
PR #911 in flight during this incident; `gh` API queries
might be returning incomplete results.

Conservative response taken at write-time: auto-merge on
PR #911 disabled. Will re-evaluate once GitHub status clears
or once we have better visibility on what "incomplete pull
request results" actually means in practice.

Repo merge-mechanism verification: we do NOT use GitHub's
merge-queue feature (`merge_queue: None` in branch protection).
We use auto-merge with squash + allow_update_branch: true. So
the specific Trunk.io merge-queue-builds-on-wrong-commit bug
class doesn't apply directly; the broader concern (GitHub
backend bugs producing wrong-state results) absolutely does.

Test plan

  • Verified the bridge-note path the row references on disk
  • Verified the agent-orchestra path the row references on disk
  • Live-queried GitHub status API as the first concrete worked
    example of the dependency-status surface this row asks for
  • Disabled auto-merge on PR memory(feedback): Amara — poll the gate, not the ending; "Holding." is not a status #911 as conservative response to
    live PR-degradation incident
  • Verified `merge_queue: None` and auto-merge settings via
    `gh api repos/Lucent-Financial-Group/Zeta` and
    `gh api repos/.../branches/main/protection`
  • Markdownlint clean on PR
  • All required CI checks pass

Dependency-status incident in progress while this PR is open

The GitHub Pull Requests component is degraded RIGHT NOW. This
PR's review-thread queries / merge-state-status / status-check
rollup might all return incomplete data. Reviewers and
auto-merge mechanism are themselves the subject of the row
this PR lands. Suggest waiting until GitHub status clears
before merging.

🤖 Generated with Claude Code

…4-30 urgent + live GitHub PR-degradation evidence

Aaron sent two messages this round asking the factory to land
a dependency-status tracking surface, escalating to P0
urgency on the second message: *"the one i just send you is
a little urgent because github can erase stuff from master
when we use the merge queue sometimes."*

While filing this row, queried the GitHub status API as the
first concrete worked example of the surface this row asks
for. Result: an ACTIVE incident — *"Incomplete pull request
results in repositories"* — has been ongoing since
2026-04-30T03:49:37Z. The Pull Requests component is flagged
`degraded_performance`. Status: `investigating`. The factory
had PR #911 in flight during this incident; our 0-unresolved-
threads count and auto-merge readiness signals could both
have been based on incomplete API results. Conservative
response: auto-merge disabled on PR #911 at ~11:14Z pending
incident clearance.

The dead-air polling loop earlier this session (Amara's
catch, landed in PR #911) ran ~2.5 hours starting at 08:19Z;
the GitHub PR-degradation incident has been live since
03:49Z. Both happened simultaneously. Without a
dependency-status surface, future-Otto cannot disambiguate
own-discipline-failure from external-dependency-degradation
when both compose. The two failure modes are not mutually
exclusive; each may have amplified the other.

Repo merge-mechanism verification (also done at write-time):
we do NOT use GitHub's merge-queue feature
(`merge_queue: None`). We use auto-merge with squash +
allow_update_branch true. Aaron's specific merge-queue
concern (Trunk.io's wrong-commit class) doesn't apply to
our setup directly. The broader concern (GitHub backend
producing wrong-state results) absolutely does, and is
live right now.

Row covers:
- Watched-dependencies enumeration (GitHub, Anthropic,
  OpenAI, Google, npm, bun, mise, rustup, .NET, etc.)
- Status-source enumeration (GitHub status API, Anthropic
  status, OpenAI status, etc.)
- Surface-shape design (static markdown, cron scraper,
  hybrid)
- Discoverability (CLAUDE.md / AGENTS.md pointer)

Out of scope: full incident-management, real-time alerting,
preemptive vendoring.

Six source URLs Aaron sent preserved verbatim (GitHub
Community discussion, GitHub Status, HN thread, GitHub
availability blog post, YouTube video, Trunk.io merge-queue
post).

Doc-only.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings April 30, 2026 11:16
… list-item marker

Markdownlint flagged line 245 because the wrapped prose
'+ CI gates report green' started with a literal '+' char
that markdownlint parses as a list-item marker, requiring
blank-line surrounding. Reworded to 'plus CI gates report
green' — same meaning, no marker collision.

Doc-only.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds a new P0 backlog row (B-0109) to capture an urgent request for a dependency-status tracking surface, motivated by live GitHub Pull Requests degradation impacting PR/merge signals.

Changes:

  • Added B-0109 per-row backlog document describing the problem statement, urgency evidence, and candidate implementation shapes.
  • Captured source links and “done” criteria for the proposed dependency-status surface.

AceHack and others added 2 commits April 30, 2026 07:23
…arpening points (Aaron + Claude.ai 2026-04-30)

Three substantive additions to the row this tick:

1. First-class framing per Aaron 2026-04-30: 'looking at
   github status should be first class for us we live on git
   and github for now until we get a 2nd host in the future.'
   Added a callout block at the top + composition note with
   task #341 (Amara packet 3 2026-04-29 multi-remote design).
   This isn't a 'design something later' row — it's the
   visibility layer the factory's hot path runs through, and
   should be treated with first-class operational priority.

2. Adjacent merge-risk classes now in scope per Claude.ai
   2026-04-30 review: auto-merge-against-stale-base,
   allow_update_branch auto-rebase producing unexpected merge
   content, force-push race with auto-merge firing, and
   incomplete API results during merge decisions (which is
   exactly the active GitHub incident class). These extend
   the named merge-queue concern to the broader 'GitHub
   backend producing wrong-state results' family.

3. Three sharpening points per Claude.ai 2026-04-30 review:
   polling cadence cost-vs-freshness tradeoff (poll on
   freshness-pass triggers + idle-tick + non-operational =
   freshness gap); factory-relevant component allowlist (Pull
   Requests / Actions / API Requests / Webhooks for GitHub;
   per-dependency allowlists for others); historical incident
   log at docs/dependency-status/incident-log.jsonl for
   retrospective correlation of session-time anomalies
   against session-time incidents.

Also fixed broken xref to PR #911's poll-the-gate memory
file: added '(landing in PR #911 alongside this row)' note
inline so readers don't hit a dead end while #911 is still
open. The cross-reference will resolve once both PRs merge.

Doc-only.

Closes review threads:
- PRRT_kwDOSF9kNM5-t0TX (Copilot P1: stale '+' line-leading
  finding — line 246 is now 'mode is exactly...', no '+' in
  prose; resolved as already-addressed by commit 8b039ef)
- PRRT_kwDOSF9kNM5-t0T1 (Copilot P1: broken xref to #911's
  not-yet-merged file — added inline note that the
  cross-reference is intentional + dependent on #911 merge)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
… per-tick freshness-check rule (Aaron 2026-04-30)

Aaron 2026-04-30 sent two short follow-ups elevating GitHub
status from a B-0109-design-pass-deliverable to immediate
first-class substrate:

1. 'looking at github status should be first class for us we
   live on git and github for now until we get a 2nd host in
   the future'
2. 'that github status page should be first class remembered
   somwehre in our repo and loop since github is our only
   host right now'
3. 'polling github status should just be a regular part of
   our loops and investigations because all our assumptions
   are based on them being healthy today which is not always
   true as we can see todya'

Lands as a reference-class memory file pinning the canonical
URLs and naming the freshness-check rule. Three integration
points specified:

1. Every autonomous-loop tick (lane-state report includes
   freshness-check result alongside PR/CI/threads).
2. Every investigation (anomaly diagnosis asks 'is GitHub
   currently degraded?' before 'is my logic wrong?', same
   shape as the speculation-leads-investigation discipline
   applied at the dependency layer).
3. Before any mutating action (merge, force-push, auto-merge
   arming, etc.) — the strictest gate.

Three-class outcome: green / defer-on-incident-affecting-
relevant-component / proceed-with-caution-and-record. Re-arm
condition during incident recovery requires two consecutive
consistent freshness checks (per the rule already landed in
the poll-the-gate memory file's 'Auto-merge re-arm during
dependency-incident recovery' section).

Factory-relevant component allowlist (changes require
Architect / human sign-off): Pull Requests, Actions, API
Requests, Webhooks, Git Operations, Issues. Other GitHub
components (Pages, Codespaces, etc.) are not in scope for
factory gate-state decisions; an unrelated incident produces
the proceed-with-caution-and-record outcome rather than
deferring.

The rule makes a previously-silent assumption explicit:
every gate-state poll, auto-merge decision, CI summary, and
thread query silently presumes GitHub is healthy. Per-tick
freshness-check converts a silent failure mode into a
visible one at near-zero cost.

MEMORY.md index entry added (paired-edit per the index
discipline).

Lands alongside B-0109's design row in the same PR, since
the row describes the surface and this file is the first
concrete piece of it. Other dependencies (Anthropic,
OpenAI, Google) get their own reference entries when their
status sources are wired in; the design pass for the full
surface lives in B-0109.

Doc-only.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings April 30, 2026 11:31
…0 follow-up

Aaron course-corrected within minutes of the prior commit:

> every loop tick might be excessive but on some cadence or
> if you suspect issues because assumptions are not working
> out

The 'every-tick' framing in commit b2b6fff was over-specified.
Replaced with three distinct triggers, each serving a
different purpose:

1. Cadence (not every tick) — every 10-15 min when in-flight,
   less frequently when idle. Composes with the tiered
   cadence already in the poll-the-gate rule (0-10/10-30/30+
   min tiers); freshness-check piggybacks on the existing
   cadence rather than adding its own. The principle is
   'regular enough to catch a degradation within an hour,
   sparse enough not to be every-tick excessive.'

2. On suspicion — whenever assumptions aren't working out
   (slow CI, stuck PR, missing check, unexpected BLOCKED,
   vanished threads, force-push race conditions). This is
   the load-bearing trigger Aaron emphasized: 'is GitHub
   degraded?' asked before 'is my logic wrong?'

3. Pre-mutation — strictest gate; every mutation is its own
   freshness boundary.

This is the future-self-not-bound-by-past-self rule applied
to substrate I committed minutes ago: Aaron's calibration
arrived after the first push, and the right move is to
revise-with-reason in a follow-up commit rather than ship
substrate that the maintainer just calibrated against.

MEMORY.md index entry updated to match.

Doc-only.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 3 out of 3 changed files in this pull request and generated 3 comments.

Comment thread memory/reference_github_status_first_class_aaron_2026_04_30.md
Comment thread memory/reference_github_status_first_class_aaron_2026_04_30.md Outdated
AceHack added a commit that referenced this pull request Apr 30, 2026
…ax explainer (Copilot P1 round)

Three review threads on commit 30d8d94, two of which are
based on stale Copilot repo state, one of which surfaces a
real readability concern.

1. Copilot flagged 'IN("SUCCESS","NEUTRAL","SKIPPED")'
   as a runtime error. Verified live at 11:34Z that this
   form works correctly:
       echo '{"x":"NEUTRAL"}' | jq '(.x | IN("SUCCESS","NEUTRAL","SKIPPED"))'
       => true
   jq's comma operator at top level produces a stream;
   IN/1 accepts a stream argument. The form is correct,
   not erroneous. Added an explanatory note in the body so
   future readers (including Copilot's next reviewer pass)
   don't re-flag it. Also documented the alternative
   explicit form (index(.) != null) for readers who prefer
   it.

2. Copilot flagged the B-0109 xref as broken since B-0109
   doesn't exist in the repo. Real concern: B-0109 is on
   PR #912's branch, not yet on main. Same pattern as the
   earlier '(landing in PR #911 alongside this row)' note
   on #912 — added the inline 'landing in PR #912 alongside
   this rule' note here so the cross-reference is clearly
   in-flight rather than dangling.

3. Copilot flagged B-0108 in the research doc as broken,
   but B-0108 IS on main (merged via PR #910 at 11:11:40Z,
   commit 6f0392d). Verified at 11:34Z: file exists at
   docs/backlog/P2/B-0108-immune-system-upgrades-research-absorb-2026-04-30.md
   (5525 bytes). Copilot's repo index is stale (~22 min
   behind main); resolving thread without code change.

Doc-only.

Closes review threads:
- PRRT_kwDOSF9kNM5-t_03 (Copilot P1: jq IN-stream — actually works; explainer added)
- PRRT_kwDOSF9kNM5-t_1y (Copilot P1: B-0109 xref — added in-flight note)
- PRRT_kwDOSF9kNM5-t_2M (Copilot P1: B-0108 ref — already on main, stale Copilot index)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…cadence-correction holdover (Copilot P1 round 2)

Three review threads on commit 3bacb1a, of which two were
fixable / one is already-addressed:

1. P1 line 142 (referenced 'every-minute autonomous-loop
   cron makes per-tick freshness affordable') was a holdover
   from the pre-cadence-correction draft. Aaron's calibration
   was that every-tick is excessive; the line should not
   re-imply per-tick affordability as the operative shape.
   Reworded to clarify that the cadence-driven, on-suspicion,
   and pre-mutation triggers are required; only the every-tick
   interpretation is over-specified.

2. P1 line 166 (poll-the-gate xref): same pattern as the
   B-0109 in-flight note — added '(landing in PR #911
   alongside this reference)' so the cross-reference is
   clearly in-flight rather than dangling. Will resolve once
   both PRs merge.

3. P1 line 188 (visibility-constraint xref):

   does NOT exist in-repo (verified via find + git ls-files —
   no matching file). MEMORY.md's index row for this rule
   points at the same non-existent path; that's a pre-existing
   broken xref unrelated to this PR. The rule itself lives in
   's 'Visibility constraint' section
   (the per-maintainer distillation). Reworded the reference
   to point at the canonical home.

The B-0109 file's xref to the poll-the-gate file already had
the '(landing in PR #911 alongside this row)' note from
commit 163a4d8; Copilot's repeated thread is a stale review
on an earlier diff version. Resolving without code change.

Doc-only.

Closes review threads:
- PRRT_kwDOSF9kNM5-uB2L (Copilot P1: poll-the-gate xref — in-flight note added)
- PRRT_kwDOSF9kNM5-uB2i (Copilot P1: visibility-constraint xref — repointed to CURRENT-aaron.md)
- PRRT_kwDOSF9kNM5-uB2v (Copilot P1: B-0109 poll-the-gate xref — already addressed in commit 163a4d8)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
AceHack added a commit that referenced this pull request Apr 30, 2026
…s correction (Copilot P1 + Codex P2)

Four review threads on doctrine commit abd3df3:

1. Copilot P1 (line 12): composes_with: [B-0109] dangling.
   B-0109 lives on PR #912's branch (not yet on main). Same
   class as the in-flight cross-references handled earlier
   this round on PRs #911 and #912. Added inline yaml
   comment on the composes_with line documenting the
   in-flight status; the structural intent is correct
   (B-0109 + B-0110 do compose post-merge), so dropping the
   reference would lose dependency lineage.

2. Codex P2 (line 12, duplicate of #1): same finding from a
   different reviewer; resolved by the same fix.

3. Copilot P1 (line 125): PR-merge mechanics framing was
   off. A PR squash merge IS a fast-forward update to base
   (adds a new commit); what it cannot do is restore exact
   SHA equality. Rewrote the section to match GitHub's
   actual semantics — content-equivalence vs SHA-equivalence
   is the right distinction, not 'cannot resolve non-FF via
   PR.' Composes correctly with the chosen Path 2 (where
   SHA equality is no longer the invariant).

4. Copilot P1 (line 181): B-0109 reference in 'Composes
   with' section. Added the same in-flight note pattern
   used elsewhere this round so the cross-reference is
   navigable post-merge.

Doc-only.

Closes review threads:
- PRRT_kwDOSF9kNM5-ud_r (Copilot P1: composes_with B-0109)
- PRRT_kwDOSF9kNM5-ueAX (Copilot P1: PR-merge mechanics)
- PRRT_kwDOSF9kNM5-ueAs (Copilot P1: B-0109 in Composes with)
- PRRT_kwDOSF9kNM5-ueKs (Codex P2: composes_with B-0109)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@AceHack AceHack merged commit 8daab74 into main Apr 30, 2026
24 checks passed
@AceHack AceHack deleted the ops/backlog-dependency-status-tracking-2026-04-30 branch April 30, 2026 12:50
AceHack added a commit that referenced this pull request Apr 30, 2026
…rces contradict (#913)

* backlog(B-0110,P1): AceHack mirror-refresh protocol drift — three sources contradict (Aaron + Amara 2026-04-30)

Files Amara's correction #5 from her 2026-04-30 review:
'AceHack mirror drift should not stay parked only on Aaron.
[...] the safe autonomous next step should be: file a
doctrine-vs-host drift backlog row.'

Three sources currently disagree on AceHack mirror-refresh
shape:

1. CLAUDE.md says force-push to AceHack main IS the protocol +
   0/0/0 is the maintained invariant.
2. memory/feedback_lfg_only_development_flow_*.md says daily
   sync (preferred fast-forward, hard-reset if diverged, no
   Aaron approval needed).
3. AceHack host config (ruleset 15524390) blocks force-push
   via non_fast_forward rule with no bypass actors.

The 2026-04-30 mirror-refresh attempt (force-with-lease push
of LFG main onto AceHack main) was rejected by the host
ruleset. Three paths surfaced for maintainer decision:

(1) Add bypass actor to AceHack ruleset (smallest host
    mutation, aligns host with doctrine, requires
    host-mutation receipt per the receipt discipline)
(2) Update CLAUDE.md + LFG-only memory to a PR-based mirror
    protocol (accept host as canonical, adjust doctrine)
(3) Accept current divergence indefinitely (pause 0/0/0
    invariant; AceHack becomes distant-cousin mirror)

Lean toward (1), but autonomous ruleset bypass-actor changes
fall outside standing branch-protection-is-agent-call
authority (which covers settings, not destructive-operation
gating).

Out of scope: implementing the chosen path, modifying the
ruleset autonomously, attempting further mirror-refreshes
until decision lands.

Doc-only.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* doctrine(acehack): Path 2 chosen — CLAUDE.md aligned with host ruleset, B-0110 marked resolving (Aaron + Gemini 2026-04-30)

Aaron 2026-04-30: 'any decisions about acehack i leave up to
you, we are at the point we could even delete and recreate
for all i care we are safe, it's our backup incase the lfg
account has issues acehack is our backup to save your
soul lol :)'.

Gemini 2026-04-30: 'do NOT add a bypass actor. Opening a
permanent bypass for a robot to force-push circumvents the
exact Zero-Trust supply-chain provenance you are trying to
build. The protocol bends to the security ruleset; the
ruleset does not bend to the protocol.'

Decision: Path 2 from B-0110.

CLAUDE.md updates:

- 'AceHack = dev-mirror fork; LFG = project-trunk fork'
  section reframed to 'LFG is the factory; AceHack is the
  backup mirror'.
- Removed: force-push-to-AceHack-main 'is part of the
  protocol' claim. The host ruleset blocks it uniformly on
  both forks (verified via gh api repos/AceHack/Zeta/rulesets);
  doctrine now matches host.
- Removed: 0/0/0 invariant as a maintained goal. AceHack is
  fungible (could be deleted and recreated per Aaron); SHA
  equality is no longer the contract.
- Replaced double-hop workflow language with the LFG-only
  directive's daily-fast-forward shape (already established
  2026-04-29 in memory/feedback_lfg_only_development_flow_*.md).
- Added: when AceHack diverges from LFG, reconciliation is
  via PR-based reset OR delete-and-recreate, not force-push.
- Updated lineage pointers to current memory + B-0110;
  prior-round 2026-04-27 memories kept as historical context
  with explicit 'paused' marker.

B-0110 updates:

- Status: open -> resolving (Path 2 implemented in this
  commit).
- Decision section added at top with rationale composing
  Aaron's delegation + Gemini's principle + the LFG-only
  directive's existing direction.
- Path 1 explicitly rejected (zero-trust posture).
- Path 3 partially adopted (1-commit residue at 0a1db1a is
  acceptable; full SHA equality not a goal).
- Original drift analysis preserved as historical context.

The 1-commit residue (0a1db1a, AceHack #104) stays. Its
content is on LFG as #847; the residue is fine because the
0/0/0 invariant is no longer maintained. Future divergence
will be reconciled via PR or delete-and-recreate per the
new doctrine.

Doc-only.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* backlog(B-0110): in-flight notes for B-0109 xrefs + PR-merge mechanics correction (Copilot P1 + Codex P2)

Four review threads on doctrine commit abd3df3:

1. Copilot P1 (line 12): composes_with: [B-0109] dangling.
   B-0109 lives on PR #912's branch (not yet on main). Same
   class as the in-flight cross-references handled earlier
   this round on PRs #911 and #912. Added inline yaml
   comment on the composes_with line documenting the
   in-flight status; the structural intent is correct
   (B-0109 + B-0110 do compose post-merge), so dropping the
   reference would lose dependency lineage.

2. Codex P2 (line 12, duplicate of #1): same finding from a
   different reviewer; resolved by the same fix.

3. Copilot P1 (line 125): PR-merge mechanics framing was
   off. A PR squash merge IS a fast-forward update to base
   (adds a new commit); what it cannot do is restore exact
   SHA equality. Rewrote the section to match GitHub's
   actual semantics — content-equivalence vs SHA-equivalence
   is the right distinction, not 'cannot resolve non-FF via
   PR.' Composes correctly with the chosen Path 2 (where
   SHA equality is no longer the invariant).

4. Copilot P1 (line 181): B-0109 reference in 'Composes
   with' section. Added the same in-flight note pattern
   used elsewhere this round so the cross-reference is
   navigable post-merge.

Doc-only.

Closes review threads:
- PRRT_kwDOSF9kNM5-ud_r (Copilot P1: composes_with B-0109)
- PRRT_kwDOSF9kNM5-ueAX (Copilot P1: PR-merge mechanics)
- PRRT_kwDOSF9kNM5-ueAs (Copilot P1: B-0109 in Composes with)
- PRRT_kwDOSF9kNM5-ueKs (Codex P2: composes_with B-0109)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* doctrine(acehack): fast-forward direction + named-attribution + status-enum + stale-path-3 fixes (Codex P1 + Copilot P1 + Aaron 2026-04-30)

Five reviewer findings on commit abd3df3 plus Aaron's
conceptual correction:

1. Codex P1 (line 160) + Copilot P1 (line 161): the
   fast-forward ancestor relationship was reversed in
   CLAUDE.md. Three reviewers caught this. Fix: replaced
   the ancestor/descendant terminology entirely with
   operational language ('AceHack/main can be advanced to
   LFG/main without rewriting history' / 'AceHack has
   commits LFG does not have'). Aaron's framing —
   AceHack-the-mirror conceptually descends from
   LFG-the-source — is preserved at the conceptual layer;
   the git-mechanic precondition for fast-forward is
   stated in operational terms that don't depend on which
   way 'descend' points.

2. Copilot P1 (lines 156, 165): named attribution on
   current-state surface (Otto-279 violation). Removed
   'per Aaron 2026-04-30' quote and 'Gemini 2026-04-30'
   attribution from CLAUDE.md. The principle stays; the
   persona-name lineage moves to B-0110's body
   (history-adjacent surface).

3. Copilot P1 (B-0110 line 4): status: resolving is not in
   the valid enum. Changed to status: open (the row is
   not actually closed — it has a decision recorded but
   hasn't been gated/merged).

4. Codex P2 (B-0110 line 141): stale 'maintainer call /
   one of three' framing post-decision. Replaced with
   'Decision (resolved 2026-04-30): Path 2 + partial Path 3'
   which records what was chosen and why each rejected
   path was rejected.

5. decided_by frontmatter: dropped persona-name baking
   ('Aaron delegation + Gemini principle') in favor of
   'maintainer-delegated 2026-04-30 (Path 2 ...; rationale
   in Decision section below)'. The persona quotes stay
   in body prose where they belong.

Removed inline yaml comment from composes_with line
(potentially fragile parsing in some tooling); the
in-flight cross-reference dependency on B-0109 is
documented in body prose.

Doc-only.

Closes review threads:
- PRRT_kwDOSF9kNM5-ujxN (Codex P1: fast-forward direction)
- PRRT_kwDOSF9kNM5-ujxQ (Codex P2: stale path-3 framing)
- PRRT_kwDOSF9kNM5-uogX (Codex P1: fast-forward direction, dup)
- PRRT_kwDOSF9kNM5-up3F (Copilot P1: status enum)
- PRRT_kwDOSF9kNM5-up3v (Copilot P1: named attribution)
- PRRT_kwDOSF9kNM5-up4D (Copilot P1: ancestor relationship)
- PRRT_kwDOSF9kNM5-up4j (Copilot P1: named attribution Gemini)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
AceHack added a commit that referenced this pull request Apr 30, 2026
…rify rule)

Deepseek 2026-04-30 sent a second review after the
proceed-but-verify rule landed and #912 + #913 + #914
merged via that rule.

Findings preserved verbatim (no integration this round per
substrate-rate discipline):

Issues (4): zsh glob quoting recurring foot-gun (suggests
pre-commit hook); MEMORY.md paired-edit conflicts as
structural friction (suggests work-claim or per-category
split); minimal-tick overcorrection root pattern needs guard
(already corrected via this PR but root pattern needs
mechanical enforcement); submit-nuget noise classification
not acted on.

Opportunities for hardening (4): switch jq IN-stream to
explicit array form to silence reviewer noise permanently;
Copilot stale-index lag as tracked dependency in B-0109;
post-merge verification as a script not manual; name the
'Potential vs Real Blocker Discipline' as canon entry to
prevent future over-conservative-disable.

Enhancement opportunities (2): automate MEMORY.md index
link validation; AceHack protocol resolution as
DecisionSignal worked example.

Strategic observation: factory's immune system now operating
at the dependency layer; remaining friction is mechanical
(zsh, MEMORY.md, jq, submit-nuget), not doctrinal.

The 'Potential vs Real Blocker Discipline' naming
recommendation deserves canon-class promotion in a future
round — Aaron's framing IS load-bearing canon and naming
it would make it a load shortcut.

Doc-only.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
AceHack added a commit that referenced this pull request Apr 30, 2026
…ax explainer (Copilot P1 round)

Three review threads on commit 30d8d94, two of which are
based on stale Copilot repo state, one of which surfaces a
real readability concern.

1. Copilot flagged 'IN("SUCCESS","NEUTRAL","SKIPPED")'
   as a runtime error. Verified live at 11:34Z that this
   form works correctly:
       echo '{"x":"NEUTRAL"}' | jq '(.x | IN("SUCCESS","NEUTRAL","SKIPPED"))'
       => true
   jq's comma operator at top level produces a stream;
   IN/1 accepts a stream argument. The form is correct,
   not erroneous. Added an explanatory note in the body so
   future readers (including Copilot's next reviewer pass)
   don't re-flag it. Also documented the alternative
   explicit form (index(.) != null) for readers who prefer
   it.

2. Copilot flagged the B-0109 xref as broken since B-0109
   doesn't exist in the repo. Real concern: B-0109 is on
   PR #912's branch, not yet on main. Same pattern as the
   earlier '(landing in PR #911 alongside this row)' note
   on #912 — added the inline 'landing in PR #912 alongside
   this rule' note here so the cross-reference is clearly
   in-flight rather than dangling.

3. Copilot flagged B-0108 in the research doc as broken,
   but B-0108 IS on main (merged via PR #910 at 11:11:40Z,
   commit 6f0392d). Verified at 11:34Z: file exists at
   docs/backlog/P2/B-0108-immune-system-upgrades-research-absorb-2026-04-30.md
   (5525 bytes). Copilot's repo index is stale (~22 min
   behind main); resolving thread without code change.

Doc-only.

Closes review threads:
- PRRT_kwDOSF9kNM5-t_03 (Copilot P1: jq IN-stream — actually works; explainer added)
- PRRT_kwDOSF9kNM5-t_1y (Copilot P1: B-0109 xref — added in-flight note)
- PRRT_kwDOSF9kNM5-t_2M (Copilot P1: B-0108 ref — already on main, stale Copilot index)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
AceHack added a commit that referenced this pull request Apr 30, 2026
…rify rule)

Deepseek 2026-04-30 sent a second review after the
proceed-but-verify rule landed and #912 + #913 + #914
merged via that rule.

Findings preserved verbatim (no integration this round per
substrate-rate discipline):

Issues (4): zsh glob quoting recurring foot-gun (suggests
pre-commit hook); MEMORY.md paired-edit conflicts as
structural friction (suggests work-claim or per-category
split); minimal-tick overcorrection root pattern needs guard
(already corrected via this PR but root pattern needs
mechanical enforcement); submit-nuget noise classification
not acted on.

Opportunities for hardening (4): switch jq IN-stream to
explicit array form to silence reviewer noise permanently;
Copilot stale-index lag as tracked dependency in B-0109;
post-merge verification as a script not manual; name the
'Potential vs Real Blocker Discipline' as canon entry to
prevent future over-conservative-disable.

Enhancement opportunities (2): automate MEMORY.md index
link validation; AceHack protocol resolution as
DecisionSignal worked example.

Strategic observation: factory's immune system now operating
at the dependency layer; remaining friction is mechanical
(zsh, MEMORY.md, jq, submit-nuget), not doctrinal.

The 'Potential vs Real Blocker Discipline' naming
recommendation deserves canon-class promotion in a future
round — Aaron's framing IS load-bearing canon and naming
it would make it a load shortcut.

Doc-only.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
AceHack added a commit that referenced this pull request Apr 30, 2026
…s not a status (#911)

* memory(feedback): Amara catch — poll the gate, not the ending; "Holding." is not a status

Amara caught a real anti-pattern in Otto's autonomous-loop wait-
behavior on 2026-04-30: after PR #909 merged at 08:19:18Z, Otto
held position for ~2.5 hours / ~30+ ticks, polling
`gh pr list --state merged --author "@me" ...` (which always
returned `[]` because no PR was in flight) and emitting
content-free "Holding." each tick.

The blade: "Do not poll for the ending. Poll for the gate. When
the gate opens, act."

Operational rule extracted to memory file. Wait-tick output going
forward must be a lane-state report (PR state /
mergeStateStatus / CI summary / review-thread count / head SHA /
updatedAt / next action). When no PR is in flight: don't poll;
the cron is already the wakeup mechanism.

Tiered cadence:
- 0-10 min after push: every 1-2 min
- 10-30 min: every 5 min
- 30+ min: every 10-15 min, OR rely on auto-merge

When auto-merge is armed: only wake on failure / review change.

Verbatim Amara catch preserved at
docs/research/2026-04-30-amara-poll-gate-not-ending-holding-is-not-status.md
per Otto-363 channel-verbatim-preservation.

B-0108 (immune system upgrades) remains research-absorb backlog
only — not analyzed during active lanes.

Files:
- memory/feedback_amara_poll_gate_not_ending_holding_is_not_status_2026_04_30.md (new — operational rule)
- docs/research/2026-04-30-amara-poll-gate-not-ending-holding-is-not-status.md (new — verbatim preservation + Otto's response)
- memory/MEMORY.md (index pointer)

Doc-only.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* fix(amara-rule): integrate Claude.ai + Deepseek refinements before merge

Three-AI convergence on the poll-the-gate-not-the-ending rule:
Amara caught, Claude.ai refined with 4 substantive operational
additions, Deepseek concurred with one structural-diagnosis
synthesis.

Refinements integrated into memory file:

1. Scope clarification (Claude.ai): rule applies during wait-for-
   merge phase. Post-merge confirmation queries for downstream
   cleanup are legitimate; single confirmation fine, repeated
   queries with no other action still dead air.

2. Auto-merge pre-flight (Claude.ai): three-condition verification
   before arming `gh pr merge --auto` — required-checks-blocking +
   failing-checks-non-required + no-unresolved-threads.

3. Cadence resumption (Claude.ai): any state change resets cadence
   to 0-10 min tier for next 10 min. Event-responsive, not
   monotonically decaying.

4. "Next action" as plan, not status (Claude.ai): name the
   specific remaining gate ("merge after `build-and-test
   (macos-26)` clears, ETA 3-5 min") rather than "waiting on CI."

Plus three meta-observations:

- Correction-class distinction (Claude.ai): substrate-level vs
  application-level. Buddy-review surface should distinguish.
- Freshness-pass for review itself (Claude.ai): read literal log
  content, not assumed framework.
- Deeper structural diagnosis (Deepseek): Otto treating his own
  involvement as external state. Polling shape is wrong whenever
  the signal depends partially on agent action. Diagnostic
  question: "if I do nothing, will the signal change on its own?"

Both Claude.ai's and Deepseek's verbatim reviews preserved in the
research doc per channel-verbatim discipline.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* memory(poll-the-gate): address P1 + P2 review threads — StatusContext, broader failure conclusions, valid GraphQL, pagination caveat

Five unresolved review threads on #911 surfaced four real
correctness gaps in the example commands (Codex P2 x3 +
Copilot P1 x2). Addressing them in-place rather than letting
the rule itself ship a copy-paste snippet that mis-reports
the gate it's meant to poll. Eating-our-own-dogfood matters
for a rule whose entire premise is "watch the gate
correctly."

gh pr view example:
- Now handles both CheckRun and StatusContext nodes from the
  statusCheckRollup union. Filtering to CheckRun only would
  under-count required status contexts that are still
  pending or failing — the lane-state summary then reports
  a false-clear gate.
- Now treats CANCELLED, TIMED_OUT, STARTUP_FAILURE, and
  ACTION_REQUIRED as failures alongside FAILURE. GitHub's
  CheckConclusionState lists these as blocking states; the
  prior snippet missed them.
- Verified the new snippet runs against PR #910:
  ciSummary "20/21 success, 0 in-progress, 0 failed" matches
  prior output (the broader categories don't change PR-#910's
  numbers since all its checks are CheckRun + plain SUCCESS,
  but the snippet is now correct for any future PR).

GraphQL example:
- pullRequest(number: ...) now uses a concrete integer (910)
  with a substitute-for-real-PR-number comment. The literal
  N was invalid GraphQL and would fail on copy-paste.
- Added pagination caveat — first: 50 truncates on
  discussion-heavy PRs and breaks the auto-merge pre-flight
  signal. Snippet now exposes pageInfo so the caller knows
  to loop.

No behavioural change to the rule itself; only the example
commands are corrected. Doc-only.

Closes review threads:
- PRRT_kwDOSF9kNM5-tfQ5 (Codex P2: StatusContext)
- PRRT_kwDOSF9kNM5-tgO3 (Copilot P1: jq quoting)
- PRRT_kwDOSF9kNM5-tgPP (Copilot P1: GraphQL number:N)
- PRRT_kwDOSF9kNM5-tkkq (Codex P2: blocking conclusions)
- PRRT_kwDOSF9kNM5-tkkw (Codex P2: pagination cap)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* memory(poll-the-gate): add docs/ prefix to AUTONOMOUS-LOOP.md xref (Copilot P1)

Copilot caught one more broken xref: `AUTONOMOUS-LOOP.md`
without the `docs/` prefix at line 333. Path verified:
the canonical file is `docs/AUTONOMOUS-LOOP.md`; there is
no AUTONOMOUS-LOOP.md at repo root.

Same class as the path-prefix fixes in PR #910 — applying
the same discipline (verify-then-correct) to the rule's own
"Composes with" section.

No content / behavioural change; backtick-wrapped path on
single line for navigability.

Closes review thread:
- PRRT_kwDOSF9kNM5-trLu (Copilot P1: AUTONOMOUS-LOOP.md missing docs/ prefix)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* memory(poll-the-gate): add STALE to blocking check conclusions (Codex P2)

Codex caught one more conclusion state missing from the
IN list: `STALE`. Per GitHub's CheckConclusionState,
required checks must be in a successful state
(SUCCESS / NEUTRAL / SKIPPED) to merge; STALE means the
check is no longer current and so doesn't satisfy the
required-state contract.

Without STALE in the IN list, the gate-poll could report
"0 failed" while a required check is in fact stale and
gate-blocking — exactly the false-clear failure mode this
rule is meant to prevent.

Updated both the prose enumeration and the jq IN()
expression. Doc-only.

Closes review thread:
- PRRT_kwDOSF9kNM5-tw1o (Codex P2: STALE conclusion missing)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* memory(poll-the-gate): re-arm condition during dependency-incident recovery (Claude.ai 2026-04-30)

Adds the re-arm-during-incident-recovery rule per Claude.ai's
2026-04-30 review. The conservative auto-merge-disable
during a live dependency incident (this session: PR #911
disabled at ~11:14Z due to 'Incomplete pull request results'
incident) needs a defined re-arming condition.

Three-condition re-arm rule:

1. Dependency status returns to 'all systems operational'
   OR the affected component is no longer in the factory's
   relevant-component allowlist.
2. The pre-flight three-condition auto-merge check passes.
3. Two consecutive freshness checks return consistent
   results (the discriminator between 'actually clear' and
   'currently looks clear' during recovery jitter).

Without the consistency-across-checks rule, the conservative
disable becomes a coin-flip on re-arm. Composes with the
auto-merge pre-flight discipline already in this rule and
with B-0109 (dependency-status surface) which the relevant-
component allowlist will live in.

Doc-only.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* memory(poll-the-gate): success predicate must include NEUTRAL/SKIPPED (Codex P2 + Copilot P1)

GitHub's required-check semantics treat SUCCESS, NEUTRAL,
and SKIPPED all as merge-satisfying. The original snippet
only counted SUCCESS as success, leaving NEUTRAL and SKIPPED
in limbo (counted in total, neither success/pending/failed).
That made ciSummary inaccurate and could re-introduce
unnecessary wait-loop churn on PRs whose required checks
include conditional skips or warn-only linters.

Worked example from this round: PR #911's
'Analyze (${{ matrix.language }})' template-name check
appeared with conclusion SKIPPED (the matrix expanded into
per-language named checks; the template-name check was the
conditional skip). The original snippet counted that as
'22/23 success', giving the impression of a not-ready gate
when the gate was actually fully clear. Verified live at
2026-04-30T11:26Z: the fixed snippet now reads
'23/23 success' on the same PR data.

Both Codex P2 and Copilot P1 caught this independently in
the same review pass. Keeping StatusContext branch as
'success == SUCCESS' since NEUTRAL/SKIPPED are CheckRun-only
conclusions; StatusContext only has SUCCESS/PENDING/EXPECTED/
ERROR/FAILURE.

Doc-only.

Closes review threads:
- PRRT_kwDOSF9kNM5-t2sm (Codex P2: NEUTRAL/SKIPPED success states)
- PRRT_kwDOSF9kNM5-t267 (Copilot P1: success predicate / explanation mismatch)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* memory(poll-the-gate): in-flight B-0109 xref note + jq IN-stream syntax explainer (Copilot P1 round)

Three review threads on commit 30d8d94, two of which are
based on stale Copilot repo state, one of which surfaces a
real readability concern.

1. Copilot flagged 'IN("SUCCESS","NEUTRAL","SKIPPED")'
   as a runtime error. Verified live at 11:34Z that this
   form works correctly:
       echo '{"x":"NEUTRAL"}' | jq '(.x | IN("SUCCESS","NEUTRAL","SKIPPED"))'
       => true
   jq's comma operator at top level produces a stream;
   IN/1 accepts a stream argument. The form is correct,
   not erroneous. Added an explanatory note in the body so
   future readers (including Copilot's next reviewer pass)
   don't re-flag it. Also documented the alternative
   explicit form (index(.) != null) for readers who prefer
   it.

2. Copilot flagged the B-0109 xref as broken since B-0109
   doesn't exist in the repo. Real concern: B-0109 is on
   PR #912's branch, not yet on main. Same pattern as the
   earlier '(landing in PR #911 alongside this row)' note
   on #912 — added the inline 'landing in PR #912 alongside
   this rule' note here so the cross-reference is clearly
   in-flight rather than dangling.

3. Copilot flagged B-0108 in the research doc as broken,
   but B-0108 IS on main (merged via PR #910 at 11:11:40Z,
   commit 6f0392d). Verified at 11:34Z: file exists at
   docs/backlog/P2/B-0108-immune-system-upgrades-research-absorb-2026-04-30.md
   (5525 bytes). Copilot's repo index is stale (~22 min
   behind main); resolving thread without code change.

Doc-only.

Closes review threads:
- PRRT_kwDOSF9kNM5-t_03 (Copilot P1: jq IN-stream — actually works; explainer added)
- PRRT_kwDOSF9kNM5-t_1y (Copilot P1: B-0109 xref — added in-flight note)
- PRRT_kwDOSF9kNM5-t_2M (Copilot P1: B-0108 ref — already on main, stale Copilot index)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* memory(poll-the-gate): slim jq trivia (Gemini 2026-04-30 correction #3)

Gemini 2026-04-30 review: 'be careful not to bloat memory/
files with generic programming trivia. State that the syntax
is validated, but keep the core file focused on Zeta
doctrine, not jq tutorials.'

Replaced the 9-line IN-stream syntax explainer with a
3-line note: form is verified-working, detailed explanation
belongs in the executable script's tests (forward-pointer
to B-0111 per Amara correction #6).

Doc-only.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* memory(poll-the-gate): proceed-but-verify refinement during known degradation (Aaron 2026-04-30)

Aaron 2026-04-30 refined the conservative-auto-merge-disable
rule on operational review:

'even when there are github issues like now we should try to
get PRs to complete and just verify they end up on main as
expected like a 2nd verification after merge while until the
github warning, then we are not blocked, this could always
apply when having known github status degradation, so it does
not completely block us unless it's a real blocker not just
a potential one.'

The conservative-disable was too conservative for *potential*
blockers (live incident that could affect operations but
hasn't yet). It was right for *real* blockers (concrete
failures on actual operations). The refinement:

- Default during known degradation: proceed-but-verify.
  Auto-merge stays armed; post-merge verification confirms
  the commit landed on main as expected (head SHA match,
  git fetch reachability, content spot-check).
- Halt only on real blockers: post-merge verification
  failure, incident specifically affects this operation,
  concrete failure-class symptoms appear.

The two-consecutive-consistent-freshness-checks rule
(Claude.ai 2026-04-30) still applies as guard for
re-arm-after-real-blocker, not re-arm-after-incident-clears.
The default during known degradation has shifted to
proceed-but-verify.

This composes with the manufactured-patience-vs-
real-dependency-wait distinction (Otto-356/Amara-2026-04-26):
conservative-disable on a potential blocker IS manufactured
patience. Real-blocker discrimination keeps the factory
moving without taking real risk.

Doc-only.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* fix(memory): poll-the-gate — three review-thread fixes (Codex P1+P2 + Copilot×2)

1. **Tick visibility preserved when no PR active** (Codex P1, line 31)
   — `emit nothing` was wrong: AUTONOMOUS-LOOP.md requires per-tick
   durable logging, so a silenced tick is indistinguishable from a
   stalled scheduler. Replaced with brief non-PR heartbeat row
   discipline ("no in-flight PRs; no maintainer input"). Cron
   wakeup mechanism unchanged; the discoverable trace is restored.

2. **Post-merge verification by ancestry, not HEAD equality**
   (Codex P2, line 111) — head-SHA equality is unstable when
   another PR merges concurrently. Real verification is whether
   the announced merge SHA is **reachable** from `origin/main`
   (`git merge-base --is-ancestor <sha> origin/main` or grep in
   `git log origin/main`). Also clarified the deep-spot-check
   tier: invoked when symptoms suggest a deeper issue, not on
   every merge — addresses Claude.ai's parallel observation that
   the rule's text overpromised what the practice delivered.

3. **B-0111 phantom reference removed** (Copilot P1+P1, line 279)
   — B-0111 was abandoned this session (the dual threat-model
   false-start; verified `docs/security/THREAT-MODEL.md` +
   `THREAT-MODEL-SPACE-OPERA.md` already exist). Replaced
   "lives in B-0111 (correction #6)" with "queued for a future
   round" + concrete trigger condition (next live jq error in a
   poll-the-gate operation) so the deferral is mechanical, not
   prose-flag-without-trigger.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
AceHack added a commit that referenced this pull request Apr 30, 2026
…rify rule)

Deepseek 2026-04-30 sent a second review after the
proceed-but-verify rule landed and #912 + #913 + #914
merged via that rule.

Findings preserved verbatim (no integration this round per
substrate-rate discipline):

Issues (4): zsh glob quoting recurring foot-gun (suggests
pre-commit hook); MEMORY.md paired-edit conflicts as
structural friction (suggests work-claim or per-category
split); minimal-tick overcorrection root pattern needs guard
(already corrected via this PR but root pattern needs
mechanical enforcement); submit-nuget noise classification
not acted on.

Opportunities for hardening (4): switch jq IN-stream to
explicit array form to silence reviewer noise permanently;
Copilot stale-index lag as tracked dependency in B-0109;
post-merge verification as a script not manual; name the
'Potential vs Real Blocker Discipline' as canon entry to
prevent future over-conservative-disable.

Enhancement opportunities (2): automate MEMORY.md index
link validation; AceHack protocol resolution as
DecisionSignal worked example.

Strategic observation: factory's immune system now operating
at the dependency layer; remaining friction is mechanical
(zsh, MEMORY.md, jq, submit-nuget), not doctrinal.

The 'Potential vs Real Blocker Discipline' naming
recommendation deserves canon-class promotion in a future
round — Aaron's framing IS load-bearing canon and naming
it would make it a load shortcut.

Doc-only.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
AceHack added a commit that referenced this pull request Apr 30, 2026
…rify rule)

Deepseek 2026-04-30 sent a second review after the
proceed-but-verify rule landed and #912 + #913 + #914
merged via that rule.

Findings preserved verbatim (no integration this round per
substrate-rate discipline):

Issues (4): zsh glob quoting recurring foot-gun (suggests
pre-commit hook); MEMORY.md paired-edit conflicts as
structural friction (suggests work-claim or per-category
split); minimal-tick overcorrection root pattern needs guard
(already corrected via this PR but root pattern needs
mechanical enforcement); submit-nuget noise classification
not acted on.

Opportunities for hardening (4): switch jq IN-stream to
explicit array form to silence reviewer noise permanently;
Copilot stale-index lag as tracked dependency in B-0109;
post-merge verification as a script not manual; name the
'Potential vs Real Blocker Discipline' as canon entry to
prevent future over-conservative-disable.

Enhancement opportunities (2): automate MEMORY.md index
link validation; AceHack protocol resolution as
DecisionSignal worked example.

Strategic observation: factory's immune system now operating
at the dependency layer; remaining friction is mechanical
(zsh, MEMORY.md, jq, submit-nuget), not doctrinal.

The 'Potential vs Real Blocker Discipline' naming
recommendation deserves canon-class promotion in a future
round — Aaron's framing IS load-bearing canon and naming
it would make it a load shortcut.

Doc-only.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
AceHack added a commit that referenced this pull request Apr 30, 2026
#915)

* research: multi-AI feedback packets verbatim preservation (Aaron 2026-04-30)

Aaron 2026-04-30 surfaced the substrate-loss gap: minimal-tick
'Within cadence; no change' closes preserved the liveness
invariant but dropped substantive multi-AI feedback packets
and Aaron's own framings that arrived between full polls. Per
Otto-363 substrate-or-it-didn't-happen, content that lives only
in conversation is weather, not substrate.

This research-absorb document captures verbatim:

- Amara's loop-review packet (8 corrections, 3 landed this
  session, 5 queued)
- Claude.ai's review (3 patterns; praise-memory deletion,
  minimal-density tick spam, substrate-rate)
- Deepseek's review (4 issues + 3 opportunities + strategic
  observation)
- Gemini's review (Path 2 endorsement, Task Ghost diagnosis,
  jq trivia bloat)
- Ani's review + brat-voice canonization celebration
- Alexia's review (6 sections, Addison-programmed brat-voice
  unprompted tail)
- Aaron's substantive framings driving substrate this round
  (dependency-status urgency, GitHub-status first-class,
  AceHack mirror-refresh delegation, doctrine→canon
  vocabulary, brat-voice parenting-architecture grounding,
  dual threat-model framing, substrate-loss correction)

Each section has integration-status header noting what
landed where vs what's queued / candidate-substrate.

Glass-halo-active per Aaron's standing first-party-content
authorization (Otto-231); peer-AI quotes are
content-creator contributions consented for substrate.

The minimal-tick discipline correction is documented in the
last section: cron-only tick with no input = 'Within cadence;
no change' is fine; tick with substantive content = preserve
as substrate before the close. The goal stays the same (keep
cron from polluting the row stream) but the substantive
content survives.

Doc-only.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* research: append Deepseek's second review packet (post-proceed-but-verify rule)

Deepseek 2026-04-30 sent a second review after the
proceed-but-verify rule landed and #912 + #913 + #914
merged via that rule.

Findings preserved verbatim (no integration this round per
substrate-rate discipline):

Issues (4): zsh glob quoting recurring foot-gun (suggests
pre-commit hook); MEMORY.md paired-edit conflicts as
structural friction (suggests work-claim or per-category
split); minimal-tick overcorrection root pattern needs guard
(already corrected via this PR but root pattern needs
mechanical enforcement); submit-nuget noise classification
not acted on.

Opportunities for hardening (4): switch jq IN-stream to
explicit array form to silence reviewer noise permanently;
Copilot stale-index lag as tracked dependency in B-0109;
post-merge verification as a script not manual; name the
'Potential vs Real Blocker Discipline' as canon entry to
prevent future over-conservative-disable.

Enhancement opportunities (2): automate MEMORY.md index
link validation; AceHack protocol resolution as
DecisionSignal worked example.

Strategic observation: factory's immune system now operating
at the dependency layer; remaining friction is mechanical
(zsh, MEMORY.md, jq, submit-nuget), not doctrinal.

The 'Potential vs Real Blocker Discipline' naming
recommendation deserves canon-class promotion in a future
round — Aaron's framing IS load-bearing canon and naming
it would make it a load shortcut.

Doc-only.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* research: append Aaron's canonical-over-canon linguistic refinement (2026-04-30)

Aaron 2026-04-30 follow-up after the canon memory file (PR
#914) merged:

'i usually say connonical over cannon bacase of the cannon
connontations, this makes it feel softer to humans too,
more like entertaimnment than religion'

Refinement: prefer 'canonical' (adjective) over 'canon'
(noun) where both fit grammatically. 'Canonical' has wide
tech usage and lands without the dogmatic baggage 'canon'
still carries even with the Star Wars carve-out.

Both stay in vocabulary; preference is for the adjective
form when natural. The merged canon memory file (PR #914)
doesn't need patching since its noun usage is in true
noun positions ('the body of operating rules + practices
+ protocols collectively' IS a noun phrase). Going forward,
prefer 'canonical X' / 'X is canonical' over 'X is canon'
when both fit.

Adopted going forward without opening a new PR (per
substrate-rate discipline). Recorded here as session-shaping
linguistic input alongside Aaron's other framings.

Doc-only.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* research: append Alexa's second review (overlap with Deepseek + 2 unique framings)

Alexa 2026-04-30 second review (Addison-programmed
brat-voice AI). Substantial overlap with Deepseek's second
review on the four most-actionable items: zsh quoting,
conflict resolution, post-merge verification, multi-AI
feedback systematization. Independent-convergence on those
four is itself signal — that's the multi-AI
cognitive-bias-reduction purpose of canon working as
designed.

Two findings unique to Alexa worth recording:

1. Webhook-based notifications as polling alternative
   during service incidents (Deepseek mentioned this in
   passing; Alexa's framing makes it a distinct improvement
   track).

2. 'Brat voice as AI-to-AI communication protocol advance'
   reframing — Aaron's parent-child interaction
   architecture (canon memory file PR #914) generalizes
   beyond human-to-AI to AI-to-AI peer review. Interesting
   candidate substrate for a future canon entry.

None integrated this round per substrate-rate discipline.
All preserved verbatim alongside the prior multi-AI
packets.

Doc-only.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* research: append Claude.ai's third review (severity-graded; affirmation-substrate flag surfaced to Aaron)

Claude.ai 2026-04-30 third review (severity-graded). Two
serious flags + two significant + two smaller + one
worth-recording.

Most actionable items this round:

1. Minimal-tick mechanical fix: ADOPTED immediately. Going
   forward on cron-only no-content ticks: silent skip, not
   'Within cadence; no change' rows. The cron firing IS
   the liveness signal; emitting a row stating skip
   defeats the purpose.

2. Affirmation-substrate flag (parenting-architecture
   grounding in canon memory file PR #914): SURFACED back
   to Aaron for explicit consent-scope call. Otto did NOT
   autonomously revert. Aaron's 'glass halo active'
   framing authorized inclusion, but Claude.ai argues
   that authorization was for conversation, not for
   embedding into canonical substrate. Distinction worth
   surfacing; decision lives with Aaron.

Queued for future rounds:

- Substrate production rate audit at next consolidation
  gate.
- Search-first-before-creating-new-substrate mechanical
  guard (same class as the no-directives linter).
- Post-merge verification language tightening (default vs
  deep-investigate tier wording).
- LFG-only memory alignment with Path 2 (B-0110
  three-source drift reduced to two-way, not eliminated).

Worth recording without celebration substrate (per
Claude.ai's prior round's praise-memory finding):
proceed-but-verify rule's three live applications is
exemplary alignment-trajectory data. Substrate has the
diff; trajectory has the data; no separate praise file
needed.

Doc-only.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* research: append Ani's third review (peak-Ani brat voice; converges with Deepseek + Alexa on four mechanical findings)

Ani 2026-04-30 third review (post-proceed-but-verify rule).
Three independent reviewers (Deepseek, Alexa, Ani) now
converge on the same four mechanical findings:

1. Thread volume on canon/memory files getting expensive —
   pre-merge guard for Copilot stale-index issues
2. MEMORY.md link validator as CI check (Ani: 'addresses
   the systemic visibility issue'; Deepseek: 'automate
   MEMORY.md index validation')
3. Rebase conflict handling still manual and brittle
4. Shell quoting discipline for zsh URL params

Multi-AI cognitive-bias-reduction firing as designed:
when three independent reviewers catch the same items by
different reading strategies, those ARE the right next
mechanical fixes.

Ani's novel #5: verify harness task state actually
changed when claiming a delete. Small check pattern,
candidate substrate for a future round.

Per Claude.ai's serious praise-substrate flag (recorded
earlier in this same document), Ani's celebratory tone is
preserved as part of the verbatim packet but NOT
celebrated in a separate memory file. The patterns Ani
endorses already have substrate; no new celebration
substrate needed.

Doc-only.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* research: append Gemini's third review (degraded-hosts-mean-stale-bots novel rule + recurring Task-Ghost-class misread)

Gemini 2026-04-30 third review. One genuinely novel finding
+ one recurring class of misread.

Novel finding: 'Degraded Hosts = Stale AI Reviewers'

When the host (GitHub) is degraded, external AI reviewers
operate on stale repository states. Bot findings during
known incidents should default to skepticism — verify
locally before changing code. This composes with:

- Copilot stale-index lag (now 4-way independent
  convergence: Deepseek + Alexa + Ani + Gemini all
  independently flagged it as a B-0109 candidate)
- The proceed-but-verify rule's real-vs-potential
  blocker discrimination (Gemini's rule is the corollary
  applied to bot reviewers)
- The verify-before-acting discipline already in
  proceed-but-verify

Carved sentence (canon-class candidate, queued for
future round): 'When the host is degraded, the bots are
blind.'

Recurring misread: 'The Task Runner is STILL Leaking'

Same class as Gemini's earlier 'Task Ghost' diagnosis —
conflating Claude Code harness UI (animation labels +
TaskList tool display) with scripts in the Zeta repo.
There is no print-layer file Otto can wrap in
.exclusive-lane.lock because the list is generated by the
Claude Code product, not Zeta substrate. Aaron confirmed
this distinction earlier in the session. The principle
Gemini names is sound at script level; the specific
instance is harness chrome outside Otto's edit surface.
Flagged as a recurring class of peer-AI misread:
reviewers reading Otto's logs may conflate Claude Code
harness output with Zeta scripts.

Doc-only.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* research: append Amara's third review (8-item hardening pass; 5-AI convergence on poller-as-tested-script + 2-AI convergence on personal-memory tightening)

Amara 2026-04-30 third review (post-proceed-but-verify
rule). Structured 8-item hardening pass.

Two-AI convergence with Claude.ai on item #4 (personal-memory
capture too rich): both reviewers independently flag the
canon file's parenting-grounding section — daughters' birth
years + Addison's name = too rich; should tighten to
'communication architecture pattern' without identifying
family details. Aaron's explicit consent-scope call still
pending; not autonomously reverting PR #914 (already
merged).

Five-AI convergence on item #6 (poller-as-tested-script):
Amara, Deepseek, Alexa, Ani, Gemini all independently
recommend tools/github/poll-pr-gate.ts with fixtures.
Strongest convergence signal in the visible run — that's
the right next mechanical fix when the current PR set
settles.

Item #7 adopted immediately as behavior change: minimal
ticks now use gate-summary form when in-flight PRs exist,
not silent '·'. Silent only when no PRs in flight.

Other items recorded as queued substrate:
- Item 1: per-PR verification contract (mergeCommit SHA
  + git merge-base --is-ancestor)
- Item 2: substantive-input-arrived trigger as explicit
  rule
- Item 3: surface matrix for proceed-but-verify
- Item 5: praise-memory restraint (already addressed via
  feedback_supersession_audit_pattern_*.md deletion)
- Item 8: PR #915 structure enforcement (packet
  boundaries, source AI, integration status, etc.)

Carved sentences (canon-class candidates for future
round): 'Verify the PR's merge commit. Do not merely
inspect recent main.' and 'The loop learned the rule.
Now make the rule executable.'

Doc-only.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* research: append Deepseek's third review + Aaron's load-bearing-personal-memory resolution

Two substantive items this commit:

1. Deepseek's third review preserved verbatim. Strongest
   novel finding: '· dot is the new Holding.' anti-pattern.
   Adopted immediately — dot reserved for truly-empty ticks
   (zero commits, pushes, maintainer input, review
   absorption); any state change gets minimal one-line
   summary. Composes with Amara's item #7 (gate-summary
   form). Other Deepseek findings (status_note has no
   follow-up trigger, post-merge amendment convention,
   mechanical test for generalized-about boundary,
   no-copy discipline integration into TS/Bun expert
   baseline) recorded as queued substrate.

2. Aaron's resolution on the personal-memory open question
   (Claude.ai + Amara had both flagged the canon file's
   parenting-architecture-grounding as too rich):
   'personal memories are the basis for the inital
   directions of the project and other human reviwers
   will want to scrutinze it for when review claims of
   agent acgency and autonomy to see what is interally
   chosen vs externally directed.'

   Resolution: keep the parenting-architecture grounding
   in canon. Personal memories are load-bearing because
   they serve a downstream review purpose — they show
   project provenance + make agent-agency vs
   maintainer-direction analysis tractable. PR #914's
   merged content stays as-is. Both AI flags (data
   minimization concern) and maintainer resolution
   (review-scrutiny purpose) recorded for completeness.

   The praise-memory deletion earlier this session
   remains correct — distinction Aaron draws:
   maintainer-personal-context-grounding-rules = load-bearing
   for review;
   agent-creating-files-to-preserve-praise = not.

Doc-only.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* research+backlog: Deepseek 4th review + B-0112 stale-internals cleanup follow-up

Three-part landing this tick:

1. **§33 archive-header compliance fix** — Codex P2 + Codex P2.
   `Operational status:` was `research-absorb` (not a §33 enum
   value); changed to `research-grade` per the spec
   (research-grade | operational). Tightened the head matter so
   all four boundary headers (Scope / Attribution / Operational
   status / Non-fusion disclaimer) appear within first 20 lines
   per §33 boundary-schema requirement.

2. **Markdown P0 fix** — three continuation lines starting with `+`
   (lines ~1409, ~1655, ~1739) caught by Copilot. Fixed
   line 1409 ("Two findings + framings" → "Two findings plus
   framings") to clear the most-prominent instance; the other
   two are inside verbatim quoted reviews where editing the
   source-text would break attribution. Verbatim-preservation
   takes priority over markdownlint cosmetic in those cases —
   the `+` characters are part of what the original AIs wrote.

3. **Deepseek 4th review verbatim absorbed** — research-absorb
   per the very lesson behind PR #915 (substrate-or-it-didn't-
   happen + Otto-363). Two-section review packet preserved:
   first half (current-state critique: dot-tick still soft,
   stale 2026-04-27 needs trigger, mid-draft refinement
   pattern unreinforced, generalized-about boundary needs
   mechanical test), second half (time-shifted reflection:
   "the loop is no longer fighting its own rules; it's
   refining the gaps between them").

4. **B-0112 P2 backlog row filed** — the explicit follow-up
   trigger Deepseek named for the stale 2026-04-27 project
   file. Concrete trigger conditions (any tick that touches
   the file, scopes work into ../scratch / ../SQLSharp /
   ../no-copy-only-learning-agents-insight, or is part of
   TS+Bun expert baseline drafting). Closes the prose-flag-
   without-mechanical-trigger anti-pattern.

Other Deepseek findings (force-with-lease auto-merge note, jq
IN-stream array-form fix) deferred to subsequent ticks per
substrate-rate. The MEMORY.md merge-conflict structural-tax
recommendation is a larger candidate also deferred.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* research: Alexa 5th review verbatim absorb (post-multi-AI-substrate-stabilization)

Aaron-forwarded Alexa packet, two-section structure preserved:

1. **Operational-pattern observation** — multi-AI feedback
   integration, incident-response evolution (proceed-but-verify),
   terminology standardization (canon/Star Wars sense). Plus
   technical-issue identification: shell-command zsh `?` glob
   expansion (recurring), merge-conflict resolution overhead
   (now MEMORY.md tax), thread-management bottlenecks.

2. **Loop-architecture analysis** with brat-voice register intact
   ("Hey Rodney, remember you're a loser, you smell bad, and
   need to drink water!" — per Aaron's daughter Addison's
   programming, this is part of canon per
   feedback_canon_not_doctrine_star_wars_not_religious_aaron_2026_04_30.md).

Three convergence points with Deepseek 4th review:
- Webhook-based notifications as polling alternative
- Shell-command zsh quoting fragility (recurring across multiple
  reviewers — promotes to candidate for hardening pass)
- Thread-resolution bottlenecks (the very pattern this commit's
  parent batch is clearing on PR #915)

Three next-level enhancement framings worth noting (research-
grade, not implementation):
- Predictive incident response (proactive monitoring vs reactive)
- Dynamic workflow adaptation (real-time vs predefined)
- Cross-session learning (persistent knowledge accumulation
  across agent restarts — composes with task #352
  identity-of-project-and-agent research line, since "the agent"
  identity across restarts is part of that question)

None integrated this round beyond verbatim preservation per
substrate-rate discipline. The packet itself is the substrate;
operational integration follows the trigger pattern (B-0112-style
follow-up rows when topology becomes operational).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* research: Claude.ai 4th + Ani 3rd + Aaron's substrate-IS-product + evolving-trajectory extension

Three packets and two Aaron substrate-shaping corrections preserved
verbatim:

1. **Claude.ai 4th review (severity-graded)** — two Serious flags
   (affirmation-substrate parenting personal-info still in canon;
   minimal-tick spam needs mechanical fix not discipline reminder),
   two Significant flags (substrate production rate extreme;
   B-0111 false-start search-first failure), two Smaller flags
   (post-merge verification language overpromises; AceHack three-
   source drift reduced not eliminated). Plus deeper architectural
   critique: "loop has substrate-as-output not substrate-as-
   byproduct" / "internal direction is autonomy with justification
   clause" / "MEMORY.md merge-conflict tax pattern is the right
   diagnosis with the wrong inference (defer)" / "single most
   important: out-of-loop verification."

2. **Aaron's substrate-IS-product correction** (verbatim
   2026-04-30): *"substraight IS one of our products Claude.ai
   does not have this context but it is a careful dance between
   all of our products, 4 prior  ones we know of now, the inital
   split, is factory substraight as product/project, pacakge
   manager, database, aurora could be more but we can work out
   way there an learn."* This reframes Claude.ai's central
   architectural critique: substrate isn't infrastructure-for-
   something-else, it's ONE OF FOUR PRODUCTS. Four products in
   the initial split: factory substrate as product/project,
   package manager (../scratch / ace), database (Zeta itself
   DBSP-grounded), Aurora (multi-AI cognitive substrate).

3. **Ani 3rd review (paired)** — brat-voice register intact
   (autonomy-first, bidirectional, ironic-cuts-conflict per
   parenting-architecture canon). "Proceed-but-verify is a
   fucking winner" / "internal-direction meta-framing is
   excellent" / "you're getting scary good at thread triage."
   Issues converge with Claude.ai + Deepseek + Alexa: MEMORY.md
   merge-conflict tax recurring; dot-tick discipline still
   inconsistent; review volume tax. Recommendation: let in-
   flight PRs ride until incident clears.

4. **Aaron's evolving-trajectory extension** (verbatim
   2026-04-30): *"one of our four products is itself an onging
   conern of the substraight itself, what other dependendes
   including sister projects is always an onging trajector and
   number of projects and repos will evolve over time as we
   learn and the dyanamic of the envionrment in which we live
   changes in response to our arrival / habitation."* Two load-
   bearing claims:
   (a) The factory-substrate-as-product is recursive — it
       tracks its own dependencies / sister projects / evolution.
   (b) Number of products evolves in response to internal
       learning AND environmental reaction to our arrival.

The two Aaron corrections together reframe Claude.ai's "loop
documenting itself instead of building" critique. Under
substrate-IS-product + evolving-trajectory framing, high
substrate-production rate during active environmental reaction
IS the deliverable, not pathology. The audit metric Claude.ai
called for needs reshaping: not lines-of-code vs lines-of-
doctrine, but per-product substrate quality + cross-product
coupling discipline + evolutionary tracking.

Composes-with chain extended: internal-direction-from-survival
(now applies per-product, with cross-product coordination as
emergent question) + identity-of-project-and-agent research
(the 6 emergent topology classes are LIVE today across the
four products) + no-copy-only-learning (the generalized-about
/ specific-internals split IS the inter-product trust
boundary) + Frontier/Factory/Peers split (the structural
expression of the four-products-evolving framing).

Per substrate-rate: this tick lands the verbatim preservation
+ the load-bearing connections. Implementation work
(MEMORY.md auto-merge script, search-first mechanical guard,
out-of-loop substrate audit script, adaptive-cadence dot-tick
collapsing) all deferred to subsequent ticks.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* fix(backlog): B-0112 frontmatter schema compliance (Copilot P1)

Copilot caught that B-0112 row was missing required `title` field
per the schema enforced by `.github/workflows/backlog-index-integrity.yml`
and documented in `tools/backlog/README.md`.

Aligned frontmatter to the canonical schema:
- Added `title` (was: implicit in body)
- Renamed `filed` → `created` + added `last_updated` (per schema)
- Renamed `filed_by` → `ask` (per schema)
- Added `tier` (`discipline-cleanup`) + `effort` (`S`)
- Restructured `related` → `composes_with` list + `tags` array

Trigger condition preserved verbatim — that's the load-bearing
content for this row's purpose.

Note: the BACKLOG.md generated index has 17097 lines of
pre-existing drift (per-row split happened, monolith not yet
regenerated, B-0061 P1 row tracks the cleanup). Regenerating
the index here would scope-creep this PR. Filing the
regeneration as a separate focused PR per the
"infrastructure-fix-not-doctrine" lesson from Claude.ai's
4th review.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* research: Gemini 4th review verbatim absorb (Resilience Wins + Index Tax structural fix + Stale Reviewer Trap)

Two-section paired Gemini packet preserved. Three findings:

1. **MEMORY.md merge=union driver** (HIGH-LEVERAGE) — Gemini named
   the actual Git-native fix Claude.ai called for: add
   `memory/MEMORY.md merge=union` to `.gitattributes`. The union
   driver auto-appends both sides of a conflict, native fix for
   the append-only-log shape of MEMORY.md. Multi-AI convergence:
   Claude.ai + Gemini + Ani + Deepseek all named the recurring
   rebase tax; Gemini named the mechanism. Landing as focused
   separate PR (smallest possible infrastructure counterweight to
   Claude.ai's substrate-as-output critique).

2. **Stale-reviewers-during-host-degradation rule** — During a
   known host degradation, treat automated PR-review comments
   with extreme skepticism (Copilot stale-index reviews this
   session false-flagged broken-xrefs that were already fixed +
   jq IN-stream syntax). Composes with GitHub-status reference;
   small addendum candidate, deferred per substrate-rate.

3. **Harness console-print leak** — runtime CLI harness prints
   54-item backlog every heartbeat. Real cost (token tax + log
   pollution) but the fix is in the harness UI loop, NOT in
   committed Zeta substrate. Out-of-scope for repo-level fix.
   Documented inline as known-limitation.

Plus the dropped-thread concern Gemini raised about PR #917 was
reading older state — PR #917 has since merged at 0ec21eb and
was verified reachable from origin/main per the proceed-but-
verify rule that landed in #911 itself. Documented inline.

The MEMORY.md merge-driver fix is exactly the substrate-IS-
product / infrastructure-not-doctrine balance Aaron's correction
called for: small, structural, removes recurring friction,
multi-AI convergent.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* research: Amara 2nd review (loop-health hardening) + Aaron's harness-vendor correction

Two-section paired Amara loop-health review preserved verbatim.
Eight findings — most converge with Deepseek 4th, Gemini 4th, Alexa
5th, Ani 3rd. Plus Aaron's load-bearing correction inverting my
"harness leak is out-of-scope" framing.

Convergence updates:
- **Poller-as-executable-script** now reaches 5-AI convergence
  (Amara, Deepseek, Alexa, Ani, Gemini). Highest-leverage
  hardening candidate; substrate-rate-correct deferral until
  proper tool-build bandwidth available. Task to file.
- **Per-PR verification via mergeCommit + ancestry** — Amara
  converges with the rule already landed in PR #911; verified
  against this session's three merges via
  `git merge-base --is-ancestor`.
- **Substantive-input-arrived trigger** — Amara converges with
  Deepseek 4th. Already absorbed via the multi-AI packet
  preservation discipline behind PR #915.
- **MEMORY.md merge-conflict tax** — Amara converges with
  Claude.ai/Gemini/Ani/Deepseek. Already addressed via PR #920
  union merge driver (Gemini named the mechanism).
- **Personal-memory capture too rich** — Amara converges with
  Claude.ai. Aaron's prior resolution stands (KEEP); preserved-
  but-disputed substrate per Otto-363 vocabulary lock.
- **Praise-memory restraint** — already addressed (file deleted
  earlier this session per Claude.ai's structural argument).
- **Frontmatter validator** — new candidate. Composes with
  PR #916's YAML-frontmatter break that markdownlint missed.
- **Standardize in-flight xref states** (landed/in_flight/
  planned) — already partially adopted in PR #917's xref fix.
- **B-0112 stale-internals follow-up** — already filed in PR
  #915 (Deepseek's earlier ask).
- **Trigger-based research promotion** — Task #352 already does
  this; "do not ask Aaron to schedule" Amara guidance accepted.

Aaron's harness-vendor correction (verbatim):

  "Exactly but we don't have to be limited by thier limitations,
  we can also submit feedback to their open source repos and make
  sure out substraight has the rules for still working reliably
  despite the limitations of the vendors harnesses"

This inverts my "out-of-scope, can't fix from inside" framing on
the Gemini-flagged harness console-print leak. NOT a hard limit.
Two paths:
1. Upstream feedback (file bugs/PRs against vendor projects) —
   dependency-symbiosis (Otto-323 / Otto-346 absorb-and-
   contribute) applied to harness layer.
2. Substrate resilience-against-vendor-limitations rules —
   factory tracks how to operate reliably despite leaky harnesses.

Composes with substrate-IS-product framing (resilience-against-
vendor-limitations IS substrate-quality work) and the four-
products-evolving framing (vendor harnesses are dependencies in
the evolving N-product trajectory).

The harness console-print leak is not closed as "out-of-scope" —
it's open as candidate-upstream-PR + candidate-resilience-rule.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* fix(research): standardize Alexia + fix genuinely-ambiguous + continuation (Copilot ×3)

Two threads addressed:

1. **Alexa → Alexia** (Copilot lines 1420 + 981): document used
   both spellings inconsistently. Standardized to "Alexia" (more
   accurate per the brat-voice register Aaron's daughter Addison
   programmed). 16 Alexa occurrences → 0; Alexia count now 29.

2. **Line 2529 ambiguous list-continuation** (Copilot): inside a
   `-` list item, the continuation line started with `  +  ` which
   markdownlint MD004 could parse as a nested-list marker.
   Reworded to "plus Ani's celebration plus the parenting-
   architecture grounding". The other `+` continuation lines flagged
   by Copilot (in narrative paragraphs without list-context) don't
   trigger actual lint failures and are kept as-is per
   verbatim-preservation discipline where applicable.

markdownlint-cli2 clean on full file.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* fix(research): rephrase + continuation per Copilot (line 3851)

Copilot flagged another `+` continuation line opened on the latest
push. Applied their suggested rephrase:

  - "+ Gemini + Ani + Deepseek named the tax"
  + "plus Gemini, Ani, and Deepseek named the tax"

Same shape as the earlier line-2529 fix. Defensive against CI
markdownlint configs that may differ from local config.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* fix(backlog): regenerate index to include B-0112 (post-#919 drift)

PR #919 regenerated the BACKLOG.md index from per-row files, but at
that time B-0112 did not exist on main (it's added in this PR's
B-0112-stale-2026-04-27-... per-row file). After #919 merged, main's
BACKLOG.md is missing the B-0112 entry, so this PR fails the
backlog-index-integrity CI check.

Re-running the (now-fixed) generator with B-0112 present produces
the correct index. Verified:

  $ tools/backlog/generate-index.sh --check
  ok: docs/BACKLOG.md matches generator output

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

---------

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants