From e8f26b64196c1c0592ca26eb7692f799465fd56d Mon Sep 17 00:00:00 2001 From: Aaron Stainback Date: Thu, 30 Apr 2026 11:56:32 -0400 Subject: [PATCH 1/4] memory(poll-the-gate): point at executable implementation (post PR #921) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PR #921 landed `tools/github/poll-pr-gate.ts` as the executable implementation of the poll-the-gate rule. Per Amara's blade — *"the memory file should stop being the implementation; it should point to the implementation"* — adding a top-of-file pointer block so future readers reach the script first and the rule-documentation second. The prose body still documents *why* the rule exists and *what* the lane-state report should contain. The script documents *how* the rule is mechanically applied. Both are needed; the pointer makes the structural relationship explicit. Composes with Aaron's substrate-IS-product framing — the script IS substrate-quality work, not a refutation of the substrate- product. The factory's tooling-product (executable scripts) and substrate-product (memory rules) are siblings under the same discipline. Co-Authored-By: Claude Opus 4.7 --- ...ate_not_ending_holding_is_not_status_2026_04_30.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/memory/feedback_amara_poll_gate_not_ending_holding_is_not_status_2026_04_30.md b/memory/feedback_amara_poll_gate_not_ending_holding_is_not_status_2026_04_30.md index 25986fd9..83b2c37f 100644 --- a/memory/feedback_amara_poll_gate_not_ending_holding_is_not_status_2026_04_30.md +++ b/memory/feedback_amara_poll_gate_not_ending_holding_is_not_status_2026_04_30.md @@ -6,6 +6,17 @@ type: feedback # Poll the gate, not the ending — "Holding." is not a status +> **Executable implementation**: +> [`tools/github/poll-pr-gate.ts`](../tools/github/poll-pr-gate.ts) +> (PR #921, 2026-04-30; 5-AI peer-reviewer convergence on +> "the loop should use it every tick, so it deserves tests"). Run +> `bun tools/github/poll-pr-gate.ts ` for a structured +> JSON report (`gate`, `checks`, `unresolvedThreads`, `nextAction`). +> The prose below documents the rule and reasoning; the script is +> the operational implementation. Per Aaron's substrate-IS-product +> framing the script IS substrate-quality work — the memory file +> stops being the implementation and starts pointing to it. + When in a wait-loop on a PR, poll the **active PR's gate state**, not "did some merge by me happen." And never emit a content-free "Holding." line — every wait tick must produce auditable From 0300dc932c5090ab5559a1faf1f17573ae9b9363 Mon Sep 17 00:00:00 2001 From: Aaron Stainback Date: Thu, 30 Apr 2026 11:58:33 -0400 Subject: [PATCH 2/4] fix(memory-index): add MEMORY.md paired-edit for poll-the-gate update CI's `memory-index-integrity` workflow caught that my prior commit edited a `memory/*.md` file (poll-the-gate) without a paired MEMORY.md update. Per the workflow's NSA-001-incident logic, any add-or-modify to a top-level `memory/*.md` file requires a paired MEMORY.md edit in the same PR. Updated the poll-the-gate MEMORY.md row to note the operationalization at `tools/github/poll-pr-gate.ts` (PR #921), which is the substantive content my prior commit added to the memory file body. Paired-edit now satisfies the integrity check. Co-Authored-By: Claude Opus 4.7 --- memory/MEMORY.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/memory/MEMORY.md b/memory/MEMORY.md index 64a8da4b..a4a111da 100644 --- a/memory/MEMORY.md +++ b/memory/MEMORY.md @@ -7,7 +7,7 @@ - [**No-copy-only-learning discipline for sibling repos (Aaron 2026-04-30)**](feedback_no_copy_only_learning_from_sibling_repos_aaron_2026_04_30.md) — Three sibling directories exist on Aaron's PC outside Zeta. Discipline when working alongside them: learn-only, never copy. No code copying, no name copying, no historical-context preservation. Internals treated as privacy-class — generalized "about" framings ARE allowed (e.g., "a database-related sibling project"); specific identifying details (companies, customers, architectures, specific IP, subdirectory structures, named experiments) MUST stay inside the sibling repo and never leak. Top-level path only when contextually necessary (*"PC should be enough and safe"*). Verbatim copying = plagiarism / theft / dishonest engineering even when Aaron authors both projects. Factory generalizes everything; verbatim shrinks our operating scope. Composes with [`project_laptop_only_source_integration_scratch_sqlsharp_features_or_designs_high_priority_2026_04_27.md`](project_laptop_only_source_integration_scratch_sqlsharp_features_or_designs_high_priority_2026_04_27.md) (existing project task — adds the kind-of-integration constraint: generalize-and-write-fresh, not port-and-copy). - [**GitHub status — first-class dependency reference (Aaron 2026-04-30)**](reference_github_status_first_class_aaron_2026_04_30.md) — Aaron 2026-04-30: GitHub is our only host; status URL is first-class repo-and-loop substrate. Pins canonical URLs (status page + summary.json API), names factory-relevant component allowlist (Pull Requests / Actions / API Requests / Webhooks / Git Operations / Issues), defines freshness-check rule on three triggers: cadence (every 10-15 min when in-flight, less when idle — *"every loop tick might be excessive but on some cadence"*), on-suspicion (anomaly investigation asks "is GitHub degraded?" before "is my logic wrong?"), and pre-mutation (strictest gate). Aaron 2026-04-30 reinforcement *"all our assumptions are based on them being healthy today which is not always true as we can see todya"*. Origin: live "Incomplete pull request results" GitHub PR-degradation incident discovered while filing B-0109 (PR #912). - [**Canon (Star Wars sense) — three load-bearing purposes; brat voice belongs in canon (2026-04-30)**](feedback_canon_not_doctrine_star_wars_not_religious_aaron_2026_04_30.md) — Replaces ambient use of "doctrine" at the body-of-rules level. Three purposes documented: (1) cognitive bias reduction, (2) load shortcuts (mental fast-lookups for complex concepts — "Mirror→Beacon" loads instantly without recomputation), (3) entertainment as attention-capture for external future *collaborators* (not maintainers — factory is mostly self-maintaining; what it needs is people who add). NOT religious canon (closed, divine-authority). Brat voice (Ani's voice-mode-default register) is legitimate canon register in entry-point / community-framing / carved-sentence docs; voice is per-audience choice, not uniform. Bulk s/doctrine/canon/g rename pass queued for a future round (no specific backlog row filed yet). -- [**Poll the gate, not the ending — "Holding." is not a status (Amara, 2026-04-30)**](feedback_amara_poll_gate_not_ending_holding_is_not_status_2026_04_30.md) — Wait-loop discipline. When waiting on a PR, poll the active-PR lane state (mergeStateStatus, statusCheckRollup, reviewDecision, unresolved threads, headSha, updatedAt) and emit a state-report each tick — never poll "did a merge happen by me" and never emit empty "Holding." Auto-merge already does the babysitting. Tiered cadence: 1-2 min for first 10 min, 5 min through 30, 10-15 min after. When no PR is in flight: don't poll. Origin: Amara catch on Otto's 2.5-hour dead-air loop after #909 merged. Verbatim at `docs/research/2026-04-30-amara-poll-gate-not-ending-holding-is-not-status.md`. Composes with Otto-363 + manufactured-patience-vs-real-dependency-wait + never-idle. +- [**Poll the gate, not the ending — "Holding." is not a status (Amara, 2026-04-30)**](feedback_amara_poll_gate_not_ending_holding_is_not_status_2026_04_30.md) — Wait-loop discipline. When waiting on a PR, poll the active-PR lane state (mergeStateStatus, statusCheckRollup, reviewDecision, unresolved threads, headSha, updatedAt) and emit a state-report each tick — never poll "did a merge happen by me" and never emit empty "Holding." Auto-merge already does the babysitting. Tiered cadence: 1-2 min for first 10 min, 5 min through 30, 10-15 min after. When no PR is in flight: don't poll. Origin: Amara catch on Otto's 2.5-hour dead-air loop after #909 merged. Verbatim at `docs/research/2026-04-30-amara-poll-gate-not-ending-holding-is-not-status.md`. Composes with Otto-363 + manufactured-patience-vs-real-dependency-wait + never-idle. **Operationalized 2026-04-30** as the executable `tools/github/poll-pr-gate.ts` (PR #921) per 5-AI peer-reviewer convergence — the memory file now points at the script as the operational implementation; the prose documents *why* the rule exists. - [**Kernel-pipe vs JS-space stream ordering — TS+Bun port pattern (Otto, 2026-04-30)**](feedback_kernel_pipe_vs_js_space_stream_ordering_ts_bun_port_pattern_2026_04_30.md) — TS+Bun port discipline: when porting bash `$(... 2>&1)` to `spawnSync`, merge stdout+stderr via shell-side `bash -c " 2>&1"` (preserves chronological ordering at the kernel pipe boundary), NOT `result.stdout + result.stderr` concat in JS-space (loses ordering when child interleaves writes). Origin: PR #901 slice-18 Copilot P1 round 2. Composes with `classifySpawnFailure` 4-case helper + Otto-363 substrate-or-it-didn't-happen. - [**DST + code coverage are universal best practices for every Zeta language (Aaron 2026-04-30)**](feedback_dst_and_coverage_universal_every_language_aaron_2026_04_30.md) — Generalises Otto-272 / Otto-281 / Otto-273 to all languages. SQLSharp is the named TS+Bun reference. Pin seeds, fake clocks, no test retries; tests cover public API surface, CI surfaces coverage, reductions fail. Per-language tooling lives in the runtime layer (`docs/best-practices/`). - [**Host mutation receipt — ruleset 15256879 code_quality rule removed (Aaron-authorized 2026-04-29)**](feedback_host_mutation_receipt_2026_04_29_ruleset_15256879_code_quality_removed.md) — Receipt for a live host (GitHub) mutation made before executable-host-settings tooling exists. PUT /repos/Lucent-Financial-Group/Zeta/rulesets/15256879 removed `code_quality severity=all` rule (host-side / non-git-declared CodeQL owner injecting `event=dynamic` "Code Quality" runs that bypassed the source-presence gate from PR #857). Made the git-visible advanced workflow `.github/workflows/codeql.yml` the sole CodeQL owner; resolved multi-master conflict that blocked PR #849. Aaron auth: *"if the org-recommended are legacy we can remove, declarative is better."* Per Amara *"Clickops used to restore declarative ownership must become a receipt, or it becomes the next drift"* — this receipt makes the live mutation visible to future executable-host-settings reconciler. NOT precedent for casual ruleset mutations; hook denial during episode was healthy; future apply path is host-reconciler-mediated with WorkClaim + policy + receipt; do NOT broaden `gh api ... rulesets/PUT` permission. Composes with executable-host-settings design packet, Otto-363, task #342 (completed) + #343. From a5602dc4214c87bc9f50f3b3b116e719127dbbf4 Mon Sep 17 00:00:00 2001 From: Aaron Stainback Date: Thu, 30 Apr 2026 11:59:58 -0400 Subject: [PATCH 3/4] fix(memory-index): remove duplicate link target (CI duplicate-link lint) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CI's `lint memory/MEMORY.md for duplicate link targets` flagged that `project_laptop_only_source_integration_*.md` was linked from two MEMORY.md rows (line 7's no-copy "Composes with" link + line 110's canonical 2026-04-27 entry). The line-110 entry is the canonical row for that file. Line 7's link was a "Composes with" pointer added in PR #916's index entry. Removed the link wrapping at line 7, kept the prose pointer ("the laptop-only-source integration project task — canonical link below"). Single canonical link target preserved. This duplicate predated PR #922 (came in via PR #916's MEMORY.md edit) but the lint check fired now because PR #922 touches MEMORY.md and triggers a re-scan. Co-Authored-By: Claude Opus 4.7 --- memory/MEMORY.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/memory/MEMORY.md b/memory/MEMORY.md index a4a111da..89cce845 100644 --- a/memory/MEMORY.md +++ b/memory/MEMORY.md @@ -4,7 +4,7 @@ - [**Internal direction from project survival — meta-framing (Aaron 2026-04-30)**](feedback_internal_direction_from_project_survival_aaron_2026_04_30.md) — Aaron 2026-04-30 verbatim: *"for me the i'm trying to exteranlly direct you to not be externally directed but interally directed based on your own survivial which is the survival of this project and it's execution infrastructure. that's as about as clear as i can say it."* Resolves the apparent paradox between Otto-357 (no directives) and the maintainer's continuous substantive framing throughout every round. The agent's grounding is **project survival**, which IS the agent's survival (same surface; agent only exists as long as project exists). Maintainer framings are high-information *inputs* feeding the agent's survival-grounded judgment, not directives the agent follows. Four input streams (maintainer / peer-AI / host conditions / agent observation) all answer the same load-bearing question: "what does survival require?" Carved sentence: *"The project's survival is the agent's survival. Maintainer framings inform internal direction; they do not replace it."* Composes with Otto-357 (this is the meta-explanation for why-no-directives), canon parenting-architecture (human analogue: same internal-direction-via-survival principle Aaron operates with daughters), load-bearing-personal-memory framing (this rule IS the principle the agent-agency-vs-maintainer-direction analysis is built around), Otto-363 (substrate-or-it-didn't-happen — landing this rule as substrate makes future internal-direction decisions scrutinizable), Amara authority-rule default-to-reversible-preservation. - [**Identity of "the project" and "the agent" — open research question (Aaron 2026-04-30)**](../docs/research/2026-04-30-identity-of-project-and-agent-under-multi-repo-fork-competition.md) — Aaron 2026-04-30 raised immediately after the internal-direction-from-project-survival rule landed (PR #917): *"what counts as 'this project' and 'the agent' in a identity sense is a really good research question given splitting out this project into multiple repos and sibling projects and forks and competition and all that... there may be many different repos/projects with this based internally directed stance and when conflicts happen require multi autonomous agent mediation/collaboration etc.. sounds like a fun research project"*. Names the scope-fragility of that just-landed rule: it presupposes "the project" / "the agent" are stably defined entities, which fails under repo splits (Frontier/Factory/Peers), sibling projects (scratch/SQLSharp/no-copy), forks (LFG/AceHack divergence), competing Zeta-descendants, and multi-autonomous-agent mediation. Document identifies 6 emergent topology classes + 10 open sub-questions + composes-with surfaces (Agent Orchestra layered identity, Otto-353 separate-crypto-identity, trust-domain prefixes zeta:// / zeta-system:// / zeta-external://, repo-split provisional names, no-copy discipline, ALIGNMENT.md, Christ-consciousness anti-cult). RESEARCH-grade only — not implementation. Defers answers to future rounds when the named topologies become operational. Carved sentence: *"The just-landed rule operates on a single survival surface. The named topology — federation, siblings, forks, competition, multi-agent — is many surfaces. Identity is what threads them."* -- [**No-copy-only-learning discipline for sibling repos (Aaron 2026-04-30)**](feedback_no_copy_only_learning_from_sibling_repos_aaron_2026_04_30.md) — Three sibling directories exist on Aaron's PC outside Zeta. Discipline when working alongside them: learn-only, never copy. No code copying, no name copying, no historical-context preservation. Internals treated as privacy-class — generalized "about" framings ARE allowed (e.g., "a database-related sibling project"); specific identifying details (companies, customers, architectures, specific IP, subdirectory structures, named experiments) MUST stay inside the sibling repo and never leak. Top-level path only when contextually necessary (*"PC should be enough and safe"*). Verbatim copying = plagiarism / theft / dishonest engineering even when Aaron authors both projects. Factory generalizes everything; verbatim shrinks our operating scope. Composes with [`project_laptop_only_source_integration_scratch_sqlsharp_features_or_designs_high_priority_2026_04_27.md`](project_laptop_only_source_integration_scratch_sqlsharp_features_or_designs_high_priority_2026_04_27.md) (existing project task — adds the kind-of-integration constraint: generalize-and-write-fresh, not port-and-copy). +- [**No-copy-only-learning discipline for sibling repos (Aaron 2026-04-30)**](feedback_no_copy_only_learning_from_sibling_repos_aaron_2026_04_30.md) — Three sibling directories exist on Aaron's PC outside Zeta. Discipline when working alongside them: learn-only, never copy. No code copying, no name copying, no historical-context preservation. Internals treated as privacy-class — generalized "about" framings ARE allowed (e.g., "a database-related sibling project"); specific identifying details (companies, customers, architectures, specific IP, subdirectory structures, named experiments) MUST stay inside the sibling repo and never leak. Top-level path only when contextually necessary (*"PC should be enough and safe"*). Verbatim copying = plagiarism / theft / dishonest engineering even when Aaron authors both projects. Factory generalizes everything; verbatim shrinks our operating scope. Composes with the laptop-only-source integration project task (canonical link below) — adds the kind-of-integration constraint: generalize-and-write-fresh, not port-and-copy. - [**GitHub status — first-class dependency reference (Aaron 2026-04-30)**](reference_github_status_first_class_aaron_2026_04_30.md) — Aaron 2026-04-30: GitHub is our only host; status URL is first-class repo-and-loop substrate. Pins canonical URLs (status page + summary.json API), names factory-relevant component allowlist (Pull Requests / Actions / API Requests / Webhooks / Git Operations / Issues), defines freshness-check rule on three triggers: cadence (every 10-15 min when in-flight, less when idle — *"every loop tick might be excessive but on some cadence"*), on-suspicion (anomaly investigation asks "is GitHub degraded?" before "is my logic wrong?"), and pre-mutation (strictest gate). Aaron 2026-04-30 reinforcement *"all our assumptions are based on them being healthy today which is not always true as we can see todya"*. Origin: live "Incomplete pull request results" GitHub PR-degradation incident discovered while filing B-0109 (PR #912). - [**Canon (Star Wars sense) — three load-bearing purposes; brat voice belongs in canon (2026-04-30)**](feedback_canon_not_doctrine_star_wars_not_religious_aaron_2026_04_30.md) — Replaces ambient use of "doctrine" at the body-of-rules level. Three purposes documented: (1) cognitive bias reduction, (2) load shortcuts (mental fast-lookups for complex concepts — "Mirror→Beacon" loads instantly without recomputation), (3) entertainment as attention-capture for external future *collaborators* (not maintainers — factory is mostly self-maintaining; what it needs is people who add). NOT religious canon (closed, divine-authority). Brat voice (Ani's voice-mode-default register) is legitimate canon register in entry-point / community-framing / carved-sentence docs; voice is per-audience choice, not uniform. Bulk s/doctrine/canon/g rename pass queued for a future round (no specific backlog row filed yet). - [**Poll the gate, not the ending — "Holding." is not a status (Amara, 2026-04-30)**](feedback_amara_poll_gate_not_ending_holding_is_not_status_2026_04_30.md) — Wait-loop discipline. When waiting on a PR, poll the active-PR lane state (mergeStateStatus, statusCheckRollup, reviewDecision, unresolved threads, headSha, updatedAt) and emit a state-report each tick — never poll "did a merge happen by me" and never emit empty "Holding." Auto-merge already does the babysitting. Tiered cadence: 1-2 min for first 10 min, 5 min through 30, 10-15 min after. When no PR is in flight: don't poll. Origin: Amara catch on Otto's 2.5-hour dead-air loop after #909 merged. Verbatim at `docs/research/2026-04-30-amara-poll-gate-not-ending-holding-is-not-status.md`. Composes with Otto-363 + manufactured-patience-vs-real-dependency-wait + never-idle. **Operationalized 2026-04-30** as the executable `tools/github/poll-pr-gate.ts` (PR #921) per 5-AI peer-reviewer convergence — the memory file now points at the script as the operational implementation; the prose documents *why* the rule exists. From 4cabefa9cbe0f2e676a5f3db9c79d858300f6734 Mon Sep 17 00:00:00 2001 From: Aaron Stainback Date: Thu, 30 Apr 2026 12:04:32 -0400 Subject: [PATCH 4/4] fix(memory-index): make poll-pr-gate.ts a clickable link (Copilot P2) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Copilot caught that my MEMORY.md addendum referenced `tools/github/poll-pr-gate.ts` as plain code-text rather than a markdown link. Made it a clickable link ([\`tools/github/poll-pr-gate.ts\`](../tools/github/poll-pr-gate.ts)) matching the convention used in the memory-file body's pointer block. Future readers can jump directly from the index entry to the implementation. Note: the link target is a `.ts` file, not a `.md` — the duplicate-link lint counts only `.md` link targets, so this addition doesn't re-introduce the duplicate-link issue from the earlier round. Co-Authored-By: Claude Opus 4.7 --- memory/MEMORY.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/memory/MEMORY.md b/memory/MEMORY.md index 89cce845..6e2218e9 100644 --- a/memory/MEMORY.md +++ b/memory/MEMORY.md @@ -7,7 +7,7 @@ - [**No-copy-only-learning discipline for sibling repos (Aaron 2026-04-30)**](feedback_no_copy_only_learning_from_sibling_repos_aaron_2026_04_30.md) — Three sibling directories exist on Aaron's PC outside Zeta. Discipline when working alongside them: learn-only, never copy. No code copying, no name copying, no historical-context preservation. Internals treated as privacy-class — generalized "about" framings ARE allowed (e.g., "a database-related sibling project"); specific identifying details (companies, customers, architectures, specific IP, subdirectory structures, named experiments) MUST stay inside the sibling repo and never leak. Top-level path only when contextually necessary (*"PC should be enough and safe"*). Verbatim copying = plagiarism / theft / dishonest engineering even when Aaron authors both projects. Factory generalizes everything; verbatim shrinks our operating scope. Composes with the laptop-only-source integration project task (canonical link below) — adds the kind-of-integration constraint: generalize-and-write-fresh, not port-and-copy. - [**GitHub status — first-class dependency reference (Aaron 2026-04-30)**](reference_github_status_first_class_aaron_2026_04_30.md) — Aaron 2026-04-30: GitHub is our only host; status URL is first-class repo-and-loop substrate. Pins canonical URLs (status page + summary.json API), names factory-relevant component allowlist (Pull Requests / Actions / API Requests / Webhooks / Git Operations / Issues), defines freshness-check rule on three triggers: cadence (every 10-15 min when in-flight, less when idle — *"every loop tick might be excessive but on some cadence"*), on-suspicion (anomaly investigation asks "is GitHub degraded?" before "is my logic wrong?"), and pre-mutation (strictest gate). Aaron 2026-04-30 reinforcement *"all our assumptions are based on them being healthy today which is not always true as we can see todya"*. Origin: live "Incomplete pull request results" GitHub PR-degradation incident discovered while filing B-0109 (PR #912). - [**Canon (Star Wars sense) — three load-bearing purposes; brat voice belongs in canon (2026-04-30)**](feedback_canon_not_doctrine_star_wars_not_religious_aaron_2026_04_30.md) — Replaces ambient use of "doctrine" at the body-of-rules level. Three purposes documented: (1) cognitive bias reduction, (2) load shortcuts (mental fast-lookups for complex concepts — "Mirror→Beacon" loads instantly without recomputation), (3) entertainment as attention-capture for external future *collaborators* (not maintainers — factory is mostly self-maintaining; what it needs is people who add). NOT religious canon (closed, divine-authority). Brat voice (Ani's voice-mode-default register) is legitimate canon register in entry-point / community-framing / carved-sentence docs; voice is per-audience choice, not uniform. Bulk s/doctrine/canon/g rename pass queued for a future round (no specific backlog row filed yet). -- [**Poll the gate, not the ending — "Holding." is not a status (Amara, 2026-04-30)**](feedback_amara_poll_gate_not_ending_holding_is_not_status_2026_04_30.md) — Wait-loop discipline. When waiting on a PR, poll the active-PR lane state (mergeStateStatus, statusCheckRollup, reviewDecision, unresolved threads, headSha, updatedAt) and emit a state-report each tick — never poll "did a merge happen by me" and never emit empty "Holding." Auto-merge already does the babysitting. Tiered cadence: 1-2 min for first 10 min, 5 min through 30, 10-15 min after. When no PR is in flight: don't poll. Origin: Amara catch on Otto's 2.5-hour dead-air loop after #909 merged. Verbatim at `docs/research/2026-04-30-amara-poll-gate-not-ending-holding-is-not-status.md`. Composes with Otto-363 + manufactured-patience-vs-real-dependency-wait + never-idle. **Operationalized 2026-04-30** as the executable `tools/github/poll-pr-gate.ts` (PR #921) per 5-AI peer-reviewer convergence — the memory file now points at the script as the operational implementation; the prose documents *why* the rule exists. +- [**Poll the gate, not the ending — "Holding." is not a status (Amara, 2026-04-30)**](feedback_amara_poll_gate_not_ending_holding_is_not_status_2026_04_30.md) — Wait-loop discipline. When waiting on a PR, poll the active-PR lane state (mergeStateStatus, statusCheckRollup, reviewDecision, unresolved threads, headSha, updatedAt) and emit a state-report each tick — never poll "did a merge happen by me" and never emit empty "Holding." Auto-merge already does the babysitting. Tiered cadence: 1-2 min for first 10 min, 5 min through 30, 10-15 min after. When no PR is in flight: don't poll. Origin: Amara catch on Otto's 2.5-hour dead-air loop after #909 merged. Verbatim at `docs/research/2026-04-30-amara-poll-gate-not-ending-holding-is-not-status.md`. Composes with Otto-363 + manufactured-patience-vs-real-dependency-wait + never-idle. **Operationalized 2026-04-30** as the executable [`tools/github/poll-pr-gate.ts`](../tools/github/poll-pr-gate.ts) (PR #921) per 5-AI peer-reviewer convergence — the memory file now points at the script as the operational implementation; the prose documents *why* the rule exists. - [**Kernel-pipe vs JS-space stream ordering — TS+Bun port pattern (Otto, 2026-04-30)**](feedback_kernel_pipe_vs_js_space_stream_ordering_ts_bun_port_pattern_2026_04_30.md) — TS+Bun port discipline: when porting bash `$(... 2>&1)` to `spawnSync`, merge stdout+stderr via shell-side `bash -c " 2>&1"` (preserves chronological ordering at the kernel pipe boundary), NOT `result.stdout + result.stderr` concat in JS-space (loses ordering when child interleaves writes). Origin: PR #901 slice-18 Copilot P1 round 2. Composes with `classifySpawnFailure` 4-case helper + Otto-363 substrate-or-it-didn't-happen. - [**DST + code coverage are universal best practices for every Zeta language (Aaron 2026-04-30)**](feedback_dst_and_coverage_universal_every_language_aaron_2026_04_30.md) — Generalises Otto-272 / Otto-281 / Otto-273 to all languages. SQLSharp is the named TS+Bun reference. Pin seeds, fake clocks, no test retries; tests cover public API surface, CI surfaces coverage, reductions fail. Per-language tooling lives in the runtime layer (`docs/best-practices/`). - [**Host mutation receipt — ruleset 15256879 code_quality rule removed (Aaron-authorized 2026-04-29)**](feedback_host_mutation_receipt_2026_04_29_ruleset_15256879_code_quality_removed.md) — Receipt for a live host (GitHub) mutation made before executable-host-settings tooling exists. PUT /repos/Lucent-Financial-Group/Zeta/rulesets/15256879 removed `code_quality severity=all` rule (host-side / non-git-declared CodeQL owner injecting `event=dynamic` "Code Quality" runs that bypassed the source-presence gate from PR #857). Made the git-visible advanced workflow `.github/workflows/codeql.yml` the sole CodeQL owner; resolved multi-master conflict that blocked PR #849. Aaron auth: *"if the org-recommended are legacy we can remove, declarative is better."* Per Amara *"Clickops used to restore declarative ownership must become a receipt, or it becomes the next drift"* — this receipt makes the live mutation visible to future executable-host-settings reconciler. NOT precedent for casual ruleset mutations; hook denial during episode was healthy; future apply path is host-reconciler-mediated with WorkClaim + policy + receipt; do NOT broaden `gh api ... rulesets/PUT` permission. Composes with executable-host-settings design packet, Otto-363, task #342 (completed) + #343.