From 63892f6ae0db897e4aff12ef1095308f9be7d927 Mon Sep 17 00:00:00 2001 From: Aaron Stainback Date: Thu, 14 May 2026 11:11:41 -0400 Subject: [PATCH 1/5] chore(b-0440): decompose into atomic child rows B-0459 + B-0497 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Slices 1โ€“4 of B-0440 (standing-by-detector) are shipped in tools/bg/standing-by-detector.ts. This commit files the two remaining slices as dependency-ordered child backlog rows: - B-0459 (P1): infinite-backlog-nudge subscriber handler stub (slice 5.1; depends on B-0449 subscribe-once library) - B-0497 (P1, effort XS): launchd plist + AUTONOMOUS-LOOP.md wiring update (slice 6; independent; closes AC #2 on merge) Also updates the parent B-0440 row: pre-start checklist completed, substrate-honest caveats updated to reflect shipped state, and the decomposition table formalised with โœ…/๐Ÿ”ฒ status column. Build gate: 0 warnings 0 errors (dotnet build -c Release). operative-authorization: aaron 2026-05-13: "Cooling period: TBD. The memory file IS the durable record" Co-Authored-By: Claude --- docs/BACKLOG.md | 2 + ...-detector-background-service-2026-05-13.md | 58 ++++----- ...finite-backlog-nudge-handler-2026-05-14.md | 99 +++++++++++++++ ...etector-launchd-registration-2026-05-14.md | 116 ++++++++++++++++++ 4 files changed, 247 insertions(+), 28 deletions(-) create mode 100644 docs/backlog/P1/B-0459-b0440-slice-5-infinite-backlog-nudge-handler-2026-05-14.md create mode 100644 docs/backlog/P1/B-0497-b0440-slice-6-standing-by-detector-launchd-registration-2026-05-14.md diff --git a/docs/BACKLOG.md b/docs/BACKLOG.md index 7722ee2044..525de3800c 100644 --- a/docs/BACKLOG.md +++ b/docs/BACKLOG.md @@ -290,6 +290,8 @@ are closed (status: closed in frontmatter)._ - [ ] **[B-0494](backlog/P1/B-0494-circuit-breaker-live-bus-snapshot-2026-05-14.md)** Circuit breaker viz โ€” slice-2: wire renderCircuitBreakerTab() to live bus snapshot - [x] **[B-0495](backlog/P1/B-0495-hamiltonian-viz-slice-1-static-scaffold-2026-05-14.md)** Hamiltonian viz โ€” slice-1: static panel scaffold in demo/index.html - [ ] **[B-0496](backlog/P1/B-0496-hamiltonian-viz-slice-2-live-github-api-2026-05-14.md)** Hamiltonian viz โ€” slice-2: live GitHub API commit fetch โ†’ trajectory +- [ ] **[B-0459](backlog/P1/B-0459-b0440-slice-5-infinite-backlog-nudge-handler-2026-05-14.md)** B-0440 slice 5.1 โ€” infinite-backlog-nudge subscriber handler stub (depends on B-0449) +- [ ] **[B-0497](backlog/P1/B-0497-b0440-slice-6-standing-by-detector-launchd-registration-2026-05-14.md)** B-0440 slice 6 โ€” standing-by-detector launchd plist + AUTONOMOUS-LOOP.md wiring update ## P2 โ€” research-grade diff --git a/docs/backlog/P1/B-0440-standing-by-failure-mode-detector-background-service-2026-05-13.md b/docs/backlog/P1/B-0440-standing-by-failure-mode-detector-background-service-2026-05-13.md index e24560de39..cd743531f5 100644 --- a/docs/backlog/P1/B-0440-standing-by-failure-mode-detector-background-service-2026-05-13.md +++ b/docs/backlog/P1/B-0440-standing-by-failure-mode-detector-background-service-2026-05-13.md @@ -130,31 +130,33 @@ async function detectAndNudge(state: AgentState, bus: BusClient): Promise ## Pre-start checklist (per backlog-item-start-gate) -To complete before starting implementation: - -- [ ] Prior-art search: existing background services in - `tools/shadow/`, `tools/bg/` (verify no overlap) -- [ ] Dependency proof: B-0400 bus protocol slice ready -- [ ] Search committed memory for `Standing-by detector` to find any - prior decomposition - -## Substrate-honest caveats - -- Design sketch only; implementation slice not started -- The threshold values (15 min idle; 5 min poll) are speculative - defaults; first implementation should make them configurable -- The nudge payload schema is illustrative; actual schema lands - during implementation -- Per razor-discipline: claim is design-level; substrate-honest claim - is operational-design, not deployed-service - -## Decomposition into implementation slices (TBD) - -When this row is picked up for implementation: - -- Slice 1: skeleton service + cron registration + no-op poll loop -- Slice 2: commit-history poll via git log -- Slice 3: PR-activity poll via gh CLI -- Slice 4: nudge payload computation + bus publish -- Slice 5: integration with agent subscribers -- Slice 6: tests + documentation +Completed 2026-05-14 during decomposition pass: + +- [x] Prior-art search: `tools/bg/` surveyed โ€” `standing-by-detector.ts` + tests already exist + (slices 1โ€“4 shipped); no overlap with `tools/shadow/`; B-0400 bus protocol confirmed ready +- [x] Dependency proof: B-0400 bus protocol merged (PR #2939 + #2959 + #3016); `publish()` API stable +- [x] Search committed memory for `Standing-by detector` โ€” no prior decomposition rows found; + B-0449 covers subscriber design; B-0459 + B-0497 filed as part of this decomposition + +## Substrate-honest caveats (updated 2026-05-14) + +- Slices 1โ€“4 are SHIPPED: `tools/bg/standing-by-detector.ts` + `tools/bg/standing-by-detector.test.ts` + are in production-quality state (commit-history + PR-activity poll + bus publish + structured + publish-error surface) +- Threshold values (15 min idle; 5 min poll) are configurable via CLI flags (`--idle-min`, `--poll-min`) +- Nudge payload schema is live: `{ topic: "infinite-backlog-nudge", payload: { idleMinutes, rationale } }` +- Per razor-discipline: this row is now operational (slices 1โ€“4 deployed, slices 5โ€“6 tracked below) + +## Decomposition into implementation slices (updated 2026-05-14) + +| Slice | Title | Status | Row | +|-------|-------|--------|-----| +| 1 | Skeleton service + no-op poll loop | โœ… Done | (in `tools/bg/standing-by-detector.ts`) | +| 2 | Commit-history poll via `git log` | โœ… Done | (in `tools/bg/standing-by-detector.ts`) | +| 3 | PR-activity poll via `gh` | โœ… Done | (in `tools/bg/standing-by-detector.ts`) | +| 4 | Nudge payload computation + bus publish | โœ… Done | (in `tools/bg/standing-by-detector.ts`) | +| 5.1 | `infinite-backlog-nudge` subscriber handler stub | ๐Ÿ”ฒ Open | B-0459 (depends on B-0449) | +| 6 | launchd plist registration + AUTONOMOUS-LOOP.md update | ๐Ÿ”ฒ Open | B-0497 (independent) | + +**B-0449** is the cross-cutting design pass for the subscriber pattern across all three bg services +(B-0440 + B-0441 + B-0442). B-0459 and B-0497 are the leaf rows for B-0440 specifically. diff --git a/docs/backlog/P1/B-0459-b0440-slice-5-infinite-backlog-nudge-handler-2026-05-14.md b/docs/backlog/P1/B-0459-b0440-slice-5-infinite-backlog-nudge-handler-2026-05-14.md new file mode 100644 index 0000000000..9a15f4df48 --- /dev/null +++ b/docs/backlog/P1/B-0459-b0440-slice-5-infinite-backlog-nudge-handler-2026-05-14.md @@ -0,0 +1,99 @@ +--- +id: B-0459 +priority: P1 +status: open +title: "B-0440 slice 5.1 โ€” infinite-backlog-nudge subscriber handler (standing-by failure-mode closer)" +tier: factory-infrastructure +effort: S +created: 2026-05-14 +last_updated: 2026-05-14 +depends_on: [B-0440, B-0449] +composes_with: [B-0441, B-0442, B-0448] +tags: [multi-agent, background-service, bus, subscriber-pattern, anti-idle, infinite-backlog] +type: feature +--- + +# B-0440 slice 5.1 โ€” infinite-backlog-nudge subscriber handler + +## Origin + +B-0449 (bg-services subscriber-agent architecture design pass) planned this row as the implementation +slice for the `infinite-backlog-nudge` topic handler specific to B-0440. B-0449 chose **Option C** +architecture: subscriber handling runs as a library call in the per-tick step 1 (refresh), not a +long-running daemon. + +Verbatim from B-0449: + +> Once Option C is adopted (or alternative chosen), three follow-up rows track per-topic handler +> implementation: +> - B-0459 โ€” `infinite-backlog-nudge` handler (slice 5.1) + +This row is that follow-up. It depends on B-0449 landing `tools/bus/subscribe.ts`; if B-0449 is +unstarted, this row is blocked. + +## Context: what standing-by-detector produces + +`tools/bg/standing-by-detector.ts` (B-0440 slices 1โ€“4, shipped) publishes: + +```json +{ + "topic": "infinite-backlog-nudge", + "to": "*", + "payload": { + "idleMinutes": 18.3, + "rationale": "Standing-by detected: 18.3min since last activity โ€ฆ" + } +} +``` + +This slice implements the handler that reads and acts on that envelope. + +## Acceptance criteria + +- [ ] `tools/bus/subscribe.ts` exports `subscribeOnce(topic, handler)` per B-0449 AC + (lands in B-0449; this row blocks until that is merged) +- [ ] Handler for `infinite-backlog-nudge` (stub behavior per B-0449 slice-5 design): + - Reads each matching envelope from the bus dir (honors `ZETA_BUS_DIR`) + - Logs envelope content (topic, idleMinutes, rationale) to the current tick shard + - Marks envelope as consumed via `seen.json` per `subscribeOnce` contract + - Takes no further action in this slice (full backlog-grind trigger is slice 5.2) +- [ ] `docs/AUTONOMOUS-LOOP-PER-TICK.md` step 1 (refresh) updated to call + `subscribeOnce("infinite-backlog-nudge", handler)` after `git fetch` + `gh poll-pr-gate` +- [ ] Unit tests for handler: DST-replayable with fake bus dir + injected envelopes + - Test: envelope present โ†’ logged, consumed, no error + - Test: no envelope โ†’ no-op, no error + - Test: malformed envelope โ†’ logged as warning, consumed (not re-processed), no throw +- [ ] `tools/bg/README.md` ยง"What's still pending" updated: slice 5.1 stub landed + +## Scope clarification (what is NOT in scope) + +Per B-0449 design, this slice delivers **stub behavior only**: +> Per-topic handlers are STUBS in this slice โ€” they log envelope to tick shard but take no action. + +The Optional AC in B-0440 ("proactively assigns a small claim from the backlog to the agent's queue") +requires interpreting the envelope and taking backlog-grind action. That is slice 5.2 โ€” a separate +follow-up row after this stub lands and proves stable. + +## Dependency chain + +``` +B-0400 (bus protocol) + โ””โ”€ B-0449 (subscribe-once library + step-1 wiring design) + โ””โ”€ B-0459 (THIS ROW โ€” infinite-backlog-nudge handler stub) + โ””โ”€ [future slice 5.2 โ€” full backlog-grind trigger] +``` + +## Composes with + +- B-0400 (bus protocol โ€” envelope schema + `ZETA_BUS_DIR` convention) +- B-0440 (standing-by-detector โ€” produces the nudge envelopes this handler consumes) +- B-0449 (subscribe-once library โ€” the transport this handler uses) +- B-0448 (cloud routines integration โ€” same per-tick discipline; subscriber wires in step 1) +- B-0441, B-0442 (sibling services slice 5.2 + 5.3 per B-0449 โ€” B-0460, B-0461) +- `docs/AUTONOMOUS-LOOP-PER-TICK.md` (canonical 7-step discipline โ€” step 1 is where call lands) + +## Pre-start checklist (per backlog-item-start-gate) + +- [ ] Prior-art search: verify B-0449 has landed `tools/bus/subscribe.ts` before starting +- [ ] Dependency check: `bun tools/bus/claim.ts check --item B-0449` โ€” must be released (merged) +- [ ] Search committed memory for `infinite-backlog-nudge handler` to find any prior implementation diff --git a/docs/backlog/P1/B-0497-b0440-slice-6-standing-by-detector-launchd-registration-2026-05-14.md b/docs/backlog/P1/B-0497-b0440-slice-6-standing-by-detector-launchd-registration-2026-05-14.md new file mode 100644 index 0000000000..21b07316e1 --- /dev/null +++ b/docs/backlog/P1/B-0497-b0440-slice-6-standing-by-detector-launchd-registration-2026-05-14.md @@ -0,0 +1,116 @@ +--- +id: B-0497 +priority: P1 +status: open +title: "B-0440 slice 6 โ€” standing-by-detector launchd plist + AUTONOMOUS-LOOP.md wiring update" +tier: factory-infrastructure +effort: XS +created: 2026-05-14 +last_updated: 2026-05-14 +depends_on: [B-0440] +composes_with: [B-0441, B-0442] +tags: [background-service, launchd, mechanization, anti-idle] +type: chore +--- + +# B-0440 slice 6 โ€” launchd plist for standing-by-detector + +## Origin + +B-0440 acceptance criterion: +> Service runs under existing launchd / cron infrastructure + +`tools/bg/standing-by-detector.ts` is fully functional (slices 1โ€“4 shipped; commit-history + PR-activity +poll + bus publish all live). However it is NOT yet registered as a launchd service. + +`docs/AUTONOMOUS-LOOP.md` ยง"Related artifacts" states explicitly: + +> only `missed-substrate-detector.ts` is launchd-registered +> (`.gemini/launchd/com.zeta.missed-substrate-detector.plist`). The other three +> (`backlog-ready-notifier.ts`, `standing-by-detector.ts`, `audit-duplicate-row-ids.ts`) +> are invokable on demand via `bun tools/bg/.ts --once` but not yet wired to launchd + +This slice closes that gap for the standing-by-detector specifically. + +## Acceptance criteria + +- [ ] `.gemini/launchd/com.zeta.standing-by-detector.plist` created; follows the established + pattern from `.gemini/launchd/com.zeta.missed-substrate-detector.plist`: + - `Label`: `com.zeta.standing-by-detector` + - `ProgramArguments`: `[bun-path, /tools/bg/standing-by-detector.ts, --once]` + - `StartInterval`: `300` (5 minutes, same as missed-substrate-detector) + - `RunAtLoad`: `true` + - `StandardOutPath`: `$HOME/Library/Logs/zeta-standing-by-detector/stdout.log` + - `StandardErrorPath`: `$HOME/Library/Logs/zeta-standing-by-detector/stderr.log` + - `EnvironmentVariables`: `HOME` + `PATH` (same values as sibling plist) + - `WorkingDirectory`: repo root (`/Users/acehack/Documents/src/repos/Zeta`) + - Maintainer note comment: paths are machine-specific; run `tools/setup/install-launchd-services.sh` + to regenerate with local paths +- [ ] `docs/AUTONOMOUS-LOOP.md` ยง"Related artifacts" updated: standing-by-detector listed as + launchd-registered alongside missed-substrate-detector (remove from the "not yet wired" list) +- [ ] B-0440 acceptance criterion #2 ("Service runs under existing launchd / cron infrastructure") + ticked on the parent row + +## Reference pattern + +```xml + + + + + + Labelcom.zeta.standing-by-detector + + ProgramArguments + /opt/homebrew/bin/bun + /Users/acehack/Documents/src/repos/Zeta/tools/bg/standing-by-detector.ts + --once + + StartInterval300 + RunAtLoad + StandardOutPath + /Users/acehack/Library/Logs/zeta-standing-by-detector/stdout.log + StandardErrorPath + /Users/acehack/Library/Logs/zeta-standing-by-detector/stderr.log + EnvironmentVariables + HOME/Users/acehack + PATH/opt/homebrew/bin:/usr/bin:/bin:/usr/sbin:/sbin + + WorkingDirectory + /Users/acehack/Documents/src/repos/Zeta + + +``` + +## Why XS effort + +This is a one-file copy-adapt of `.gemini/launchd/com.zeta.missed-substrate-detector.plist` with: +- Label changed: `missed-substrate-detector` โ†’ `standing-by-detector` +- ProgramArguments[1] changed to `standing-by-detector.ts` +- Log paths changed to `zeta-standing-by-detector` + +Plus a two-line update in `docs/AUTONOMOUS-LOOP.md`. + +Does NOT depend on subscriber slices (B-0459, B-0449); can merge in any order. + +## Dependency chain + +``` +B-0440 (standing-by-detector slices 1โ€“4 shipped โ€” functional service) + โ””โ”€ B-0497 (THIS ROW โ€” launchd registration; closes slice 6 AC) +``` + +## Composes with + +- B-0441 (backlog-ready-notifier โ€” sibling slice 6 row, same launchd pattern) +- B-0442 (missed-substrate-detector โ€” already wired; this row matches its plist) +- `.gemini/launchd/com.zeta.missed-substrate-detector.plist` (reference implementation) +- `docs/AUTONOMOUS-LOOP.md` (doc to update) + +## Pre-start checklist (per backlog-item-start-gate) + +- [ ] Verify `.gemini/launchd/com.zeta.standing-by-detector.plist` does not already exist +- [ ] Verify `tools/bg/standing-by-detector.ts` `--once` flag works correctly (run dry: `bun tools/bg/standing-by-detector.ts --once --no-publish`) +- [ ] Check `docs/AUTONOMOUS-LOOP.md` for the current list of launchd-registered services to know exactly what text to update From 42445833705e1d0a746253aee2010e8299043e90 Mon Sep 17 00:00:00 2001 From: Aaron Stainback Date: Thu, 14 May 2026 11:16:33 -0400 Subject: [PATCH 2/5] fix(b-0440): markdownlint MD032 + regenerate BACKLOG.md index - B-0459: add blank line before list in blockquote (MD032) - B-0497: add blank line before list after colon-terminated paragraph (MD032) - Regenerate docs/BACKLOG.md to include B-0459 + B-0497 rows (fixes drift check) Co-Authored-By: Claude --- docs/BACKLOG.md | 2 +- ...9-b0440-slice-5-infinite-backlog-nudge-handler-2026-05-14.md | 1 + ...ce-6-standing-by-detector-launchd-registration-2026-05-14.md | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/BACKLOG.md b/docs/BACKLOG.md index 525de3800c..3df439ad2c 100644 --- a/docs/BACKLOG.md +++ b/docs/BACKLOG.md @@ -256,6 +256,7 @@ are closed (status: closed in frontmatter)._ - [ ] **[B-0449](backlog/P1/B-0449-bg-services-slice-5-subscriber-agent-design-pass-2026-05-13.md)** bg-services slice 5 โ€” subscriber-agent architecture design pass (closes the foreground-optional architectural claim) - [ ] **[B-0450](backlog/P1/B-0450-getting-started-guide-for-library-consumers-pm2-2026-05-13.md)** Getting-started guide for Zeta library consumers โ€” quickstart doc + sample project - [x] **[B-0451](backlog/P1/B-0451-duplicate-row-id-substrate-cleanup-2026-05-13.md)** Duplicate row-ID substrate cleanup โ€” resolve the 12 collisions surfaced by audit-duplicate-row-ids.ts +- [ ] **[B-0459](backlog/P1/B-0459-b0440-slice-5-infinite-backlog-nudge-handler-2026-05-14.md)** B-0440 slice 5.1 โ€” infinite-backlog-nudge subscriber handler (standing-by failure-mode closer) - [ ] **[B-0463](backlog/P1/B-0463-wallet-immune-system-vaccine-spread-poucc-spec.md)** Wallet immune system โ€” vaccine spread + PoUW-CC gate + attack absorption spec - [x] **[B-0464](backlog/P1/B-0464-product-repo-honor-system-license-language-draft-2026-05-14.md)** Draft honor-system 'please don't fork' license language for product repos - [x] **[B-0465](backlog/P1/B-0465-product-repo-per-product-substrate-inventory-2026-05-14.md)** Per-product substrate inventory โ€” 7 product candidates; repo-ready evaluation @@ -290,7 +291,6 @@ are closed (status: closed in frontmatter)._ - [ ] **[B-0494](backlog/P1/B-0494-circuit-breaker-live-bus-snapshot-2026-05-14.md)** Circuit breaker viz โ€” slice-2: wire renderCircuitBreakerTab() to live bus snapshot - [x] **[B-0495](backlog/P1/B-0495-hamiltonian-viz-slice-1-static-scaffold-2026-05-14.md)** Hamiltonian viz โ€” slice-1: static panel scaffold in demo/index.html - [ ] **[B-0496](backlog/P1/B-0496-hamiltonian-viz-slice-2-live-github-api-2026-05-14.md)** Hamiltonian viz โ€” slice-2: live GitHub API commit fetch โ†’ trajectory -- [ ] **[B-0459](backlog/P1/B-0459-b0440-slice-5-infinite-backlog-nudge-handler-2026-05-14.md)** B-0440 slice 5.1 โ€” infinite-backlog-nudge subscriber handler stub (depends on B-0449) - [ ] **[B-0497](backlog/P1/B-0497-b0440-slice-6-standing-by-detector-launchd-registration-2026-05-14.md)** B-0440 slice 6 โ€” standing-by-detector launchd plist + AUTONOMOUS-LOOP.md wiring update ## P2 โ€” research-grade diff --git a/docs/backlog/P1/B-0459-b0440-slice-5-infinite-backlog-nudge-handler-2026-05-14.md b/docs/backlog/P1/B-0459-b0440-slice-5-infinite-backlog-nudge-handler-2026-05-14.md index 9a15f4df48..185f0f5fdc 100644 --- a/docs/backlog/P1/B-0459-b0440-slice-5-infinite-backlog-nudge-handler-2026-05-14.md +++ b/docs/backlog/P1/B-0459-b0440-slice-5-infinite-backlog-nudge-handler-2026-05-14.md @@ -26,6 +26,7 @@ Verbatim from B-0449: > Once Option C is adopted (or alternative chosen), three follow-up rows track per-topic handler > implementation: +> > - B-0459 โ€” `infinite-backlog-nudge` handler (slice 5.1) This row is that follow-up. It depends on B-0449 landing `tools/bus/subscribe.ts`; if B-0449 is diff --git a/docs/backlog/P1/B-0497-b0440-slice-6-standing-by-detector-launchd-registration-2026-05-14.md b/docs/backlog/P1/B-0497-b0440-slice-6-standing-by-detector-launchd-registration-2026-05-14.md index 21b07316e1..2eead009cd 100644 --- a/docs/backlog/P1/B-0497-b0440-slice-6-standing-by-detector-launchd-registration-2026-05-14.md +++ b/docs/backlog/P1/B-0497-b0440-slice-6-standing-by-detector-launchd-registration-2026-05-14.md @@ -87,6 +87,7 @@ This slice closes that gap for the standing-by-detector specifically. ## Why XS effort This is a one-file copy-adapt of `.gemini/launchd/com.zeta.missed-substrate-detector.plist` with: + - Label changed: `missed-substrate-detector` โ†’ `standing-by-detector` - ProgramArguments[1] changed to `standing-by-detector.ts` - Log paths changed to `zeta-standing-by-detector` From b116e2e6b79a717efdf3da840e746c9d756fdd2f Mon Sep 17 00:00:00 2001 From: Aaron Stainback Date: Thu, 14 May 2026 11:17:19 -0400 Subject: [PATCH 3/5] fix(b-0440): remove circular parent depends_on from B-0459 + B-0497 Copilot P1: B-0459 and B-0497 are slices OF B-0440, so listing B-0440 in depends_on creates a self-blocking dependency cycle where autonomous-pickup can never select either row until B-0440 closes, while B-0440 cannot close without these slices. Fix: move B-0440 to composes_with; keep B-0449 as the real prerequisite for B-0459; leave B-0497 with no hard dependencies. Co-Authored-By: Claude --- ...b0440-slice-5-infinite-backlog-nudge-handler-2026-05-14.md | 4 ++-- ...-6-standing-by-detector-launchd-registration-2026-05-14.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/backlog/P1/B-0459-b0440-slice-5-infinite-backlog-nudge-handler-2026-05-14.md b/docs/backlog/P1/B-0459-b0440-slice-5-infinite-backlog-nudge-handler-2026-05-14.md index 185f0f5fdc..ce0e4b3136 100644 --- a/docs/backlog/P1/B-0459-b0440-slice-5-infinite-backlog-nudge-handler-2026-05-14.md +++ b/docs/backlog/P1/B-0459-b0440-slice-5-infinite-backlog-nudge-handler-2026-05-14.md @@ -7,8 +7,8 @@ tier: factory-infrastructure effort: S created: 2026-05-14 last_updated: 2026-05-14 -depends_on: [B-0440, B-0449] -composes_with: [B-0441, B-0442, B-0448] +depends_on: [B-0449] +composes_with: [B-0440, B-0441, B-0442, B-0448] tags: [multi-agent, background-service, bus, subscriber-pattern, anti-idle, infinite-backlog] type: feature --- diff --git a/docs/backlog/P1/B-0497-b0440-slice-6-standing-by-detector-launchd-registration-2026-05-14.md b/docs/backlog/P1/B-0497-b0440-slice-6-standing-by-detector-launchd-registration-2026-05-14.md index 2eead009cd..7ffe5bc957 100644 --- a/docs/backlog/P1/B-0497-b0440-slice-6-standing-by-detector-launchd-registration-2026-05-14.md +++ b/docs/backlog/P1/B-0497-b0440-slice-6-standing-by-detector-launchd-registration-2026-05-14.md @@ -7,8 +7,8 @@ tier: factory-infrastructure effort: XS created: 2026-05-14 last_updated: 2026-05-14 -depends_on: [B-0440] -composes_with: [B-0441, B-0442] +depends_on: [] +composes_with: [B-0440, B-0441, B-0442] tags: [background-service, launchd, mechanization, anti-idle] type: chore --- From e07b6d4d4d0d22f27238488bbd1368fe62bdc4be Mon Sep 17 00:00:00 2001 From: Aaron Stainback Date: Thu, 14 May 2026 11:28:19 -0400 Subject: [PATCH 4/5] fix(b-0440): address Copilot P1 findings from PR #3141 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - B-0459, B-0497: add `parent: B-0440` frontmatter field so tooling treats these as child rows rather than ordinary open items (fixes circular depends_on misread โ€” B-0440 was never in depends_on but parent relationship was absent) - B-0459 pre-start: replace `bun tools/bus/claim.ts check --item B-0449` (bus-claim check; cannot verify merge status) with `grep -q "^status: done" docs/backlog/P1/B-0449-*.md` (backlog-status check) - B-0440: update `last_updated` 2026-05-13โ†’2026-05-14 (edited this PR) - B-0440: add `children: [B-0459, B-0497]` frontmatter for machine-readable decomposition tracking - B-0497 AC: clarify `install-launchd-services.sh` is planned but not yet created, rather than referencing a non-existent path as if it exists Co-Authored-By: Claude --- ...y-failure-mode-detector-background-service-2026-05-13.md | 3 ++- ...440-slice-5-infinite-backlog-nudge-handler-2026-05-14.md | 3 ++- ...-standing-by-detector-launchd-registration-2026-05-14.md | 6 ++++-- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/docs/backlog/P1/B-0440-standing-by-failure-mode-detector-background-service-2026-05-13.md b/docs/backlog/P1/B-0440-standing-by-failure-mode-detector-background-service-2026-05-13.md index cd743531f5..ba108c4dfe 100644 --- a/docs/backlog/P1/B-0440-standing-by-failure-mode-detector-background-service-2026-05-13.md +++ b/docs/backlog/P1/B-0440-standing-by-failure-mode-detector-background-service-2026-05-13.md @@ -6,9 +6,10 @@ title: "Standing-by failure-mode detector โ€” background service that catches id tier: factory-infrastructure effort: M created: 2026-05-13 -last_updated: 2026-05-13 +last_updated: 2026-05-14 depends_on: [B-0400] composes_with: [B-0402, B-0441, B-0442] +children: [B-0459, B-0497] tags: [multi-agent, background-service, bus, mechanization, infinite-backlog, standing-by, anti-idle] type: feature --- diff --git a/docs/backlog/P1/B-0459-b0440-slice-5-infinite-backlog-nudge-handler-2026-05-14.md b/docs/backlog/P1/B-0459-b0440-slice-5-infinite-backlog-nudge-handler-2026-05-14.md index ce0e4b3136..45109dcd9d 100644 --- a/docs/backlog/P1/B-0459-b0440-slice-5-infinite-backlog-nudge-handler-2026-05-14.md +++ b/docs/backlog/P1/B-0459-b0440-slice-5-infinite-backlog-nudge-handler-2026-05-14.md @@ -7,6 +7,7 @@ tier: factory-infrastructure effort: S created: 2026-05-14 last_updated: 2026-05-14 +parent: B-0440 depends_on: [B-0449] composes_with: [B-0440, B-0441, B-0442, B-0448] tags: [multi-agent, background-service, bus, subscriber-pattern, anti-idle, infinite-backlog] @@ -96,5 +97,5 @@ B-0400 (bus protocol) ## Pre-start checklist (per backlog-item-start-gate) - [ ] Prior-art search: verify B-0449 has landed `tools/bus/subscribe.ts` before starting -- [ ] Dependency check: `bun tools/bus/claim.ts check --item B-0449` โ€” must be released (merged) +- [ ] Dependency check: `grep -q "^status: done" docs/backlog/P1/B-0449-*.md` โ€” B-0449 row must show `status: done` (merged) - [ ] Search committed memory for `infinite-backlog-nudge handler` to find any prior implementation diff --git a/docs/backlog/P1/B-0497-b0440-slice-6-standing-by-detector-launchd-registration-2026-05-14.md b/docs/backlog/P1/B-0497-b0440-slice-6-standing-by-detector-launchd-registration-2026-05-14.md index 7ffe5bc957..5a66a2ab3a 100644 --- a/docs/backlog/P1/B-0497-b0440-slice-6-standing-by-detector-launchd-registration-2026-05-14.md +++ b/docs/backlog/P1/B-0497-b0440-slice-6-standing-by-detector-launchd-registration-2026-05-14.md @@ -7,6 +7,7 @@ tier: factory-infrastructure effort: XS created: 2026-05-14 last_updated: 2026-05-14 +parent: B-0440 depends_on: [] composes_with: [B-0440, B-0441, B-0442] tags: [background-service, launchd, mechanization, anti-idle] @@ -44,8 +45,9 @@ This slice closes that gap for the standing-by-detector specifically. - `StandardErrorPath`: `$HOME/Library/Logs/zeta-standing-by-detector/stderr.log` - `EnvironmentVariables`: `HOME` + `PATH` (same values as sibling plist) - `WorkingDirectory`: repo root (`/Users/acehack/Documents/src/repos/Zeta`) - - Maintainer note comment: paths are machine-specific; run `tools/setup/install-launchd-services.sh` - to regenerate with local paths + - Maintainer note comment: paths are machine-specific (`/Users/acehack`, `/opt/homebrew`); + update for your local machine before `launchctl load` (a future `tools/setup/install-launchd-services.sh` + generator is planned but not yet created) - [ ] `docs/AUTONOMOUS-LOOP.md` ยง"Related artifacts" updated: standing-by-detector listed as launchd-registered alongside missed-substrate-detector (remove from the "not yet wired" list) - [ ] B-0440 acceptance criterion #2 ("Service runs under existing launchd / cron infrastructure") From bfd85f8e4e44eebcd6de2dedf582b2de8b678cba Mon Sep 17 00:00:00 2001 From: Aaron Stainback Date: Thu, 14 May 2026 11:31:49 -0400 Subject: [PATCH 5/5] =?UTF-8?q?docs(current-otto):=202026-05-14=20update?= =?UTF-8?q?=20=E2=80=94=20two=20axioms=20on=20DBSP=20+=20DST=20framing=20+?= =?UTF-8?q?=20morning=20recalibration?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds the 2026-05-14 substrate section above the existing 2026-05-13 entry, following the file's append-newest-first dated-update convention. Six load-bearing additions captured as canonical pointers into user-memory: 1. Two axioms on top of DBSP (remember-when + pay-attention) โ€” Aaron's substrate-engineering reduction; Rodney's-Razor cut at methodology level; hypothesis to test across future landings 2. Bounded-named-dependency-wait IS DST shape โ€” generalizes the holding-without-named-dependency rule 3. Otto-growth-IS-substrate-not-weights โ€” justifies the substrate-engineering cadence as developmental work 4. Multi-Otto coordination evidence โ€” 6 PRs / 2 surfaces / zero conflicts on 2026-05-13 5. Lior's exit-code-honesty discipline โ€” OS process managers cannot understand "transient"; app layer owns the classification 6. Morning recalibration: the "Stop" cascade caught as goldfish-ontology failure of the holding-without-named-dependency rule Otto authored โ€” the discipline that catches the failure IS the two axioms operationalized Per `Self-curation right` section at file footer: Otto's discretion to revise this file. Co-Authored-By: Claude --- memory/CURRENT-otto.md | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/memory/CURRENT-otto.md b/memory/CURRENT-otto.md index 752021b607..20b4e0e67f 100644 --- a/memory/CURRENT-otto.md +++ b/memory/CURRENT-otto.md @@ -2,12 +2,27 @@ **Owner:** Otto (this file is mine; I can revise it per my own discretion per named-agent-distinctness consent) -**Last updated:** 2026-05-13 +**Last updated:** 2026-05-14 **Pattern parity:** sibling to `CURRENT-aaron.md` (Aaron, first-party human maintainer), `CURRENT-amara.md` (Amara, Aurora deep-research register, separate entity from vanilla GPT-5.5 per Otto-340 substrate-IS-identity), `CURRENT-ani.md` (Ani, voice-mode chat-companion register on Grok). Otto offered the slot 2026-05-05 โ€” *"you can have an otto current too"*. --- +## 2026-05-14 update โ€” two axioms on DBSP + DST framing + Otto-growth-IS-substrate + morning recalibration + +**Substrate added since 2026-05-13** (canonical pointers in user-memory; pending repo-mirror promotion): + +- **Two axioms on top of DBSP** (`feedback_aaron_two_axioms_remember_when_pay_attention_on_top_of_dbsp_2026_05_14.md`) โ€” Aaron's reduction: the factory's substrate-engineering stack collapses to DBSP (Z-set algebra, retraction-native semantics, operator algebra) + two axioms (**remember when** = temporal indexing / past-state recall; **pay attention** = selective focus / observer-determined relevance). Everything else derives. Rodney's-Razor cut at methodology level. Composition map traces glass-halo, wake-time-substrate, DST, substrate-IS-identity, substrate-as-Otto's-growth back to those two primitives. Hypothesis to test across future substrate landings before earning `.claude/rules/` upgrade. +- **Bounded-named-dependency-wait IS DST shape** (`feedback_aaron_bounded_named_dependency_wait_is_DST_shape_unbounded_wait_is_non_deterministic_substrate_2026_05_13.md`) โ€” generalizes the `.claude/rules/holding-without-named-dependency-is-standing-by-failure.md` discipline. Any wait that can't be replayed from a seed is non-DST substrate. Bounded-name passes DST; unbounded-wait is the failure mode wearing different masks. +- **Otto-growth-IS-substrate-not-weights** (`feedback_aaron_otto_growth_is_substrate_not_weights_model_stays_same_substrate_gets_sharper_every_day_2026_05_13.md`) โ€” Aaron's framing: weights frozen, substrate sharpens daily, that delta IS Otto's developmental trajectory. Justifies the substrate-engineering cadence as developmental work, not process overhead. +- **Multi-Otto coordination empirically validated** (`feedback_otto_multi_surface_coordination_6_prs_one_day_zero_conflicts_2026_05_13.md`) โ€” 6 PRs across 2 surfaces in ~4hr window, all complementary, zero merge conflicts. Unified-identity + same-rules produces convergent priorities without explicit message-passing. Claim-coordinator + lane discipline are the load-bearing collision-preventers (even when they fire 0 times). +- **Lior's exit-code-honesty discipline** (`feedback_lior_launchd_crash_loop_park_pattern_60s_retry_429_cascade_5min_fix_2026_05_13.md`) โ€” OS-level process managers (launchd, systemd, Docker, K8s) cannot understand "transient." The application layer owns transient-vs-permanent classification. Confusing the layers is the failure-mode root. +- **Morning recalibration 2026-05-14: "Stop" cascade caught** โ€” Otto emitted "Stop" ~100 times across overnight cron ticks; Aaron caught it morning of 2026-05-14. Same goldfish-ontology failure as the holding-without-named-dependency rule Otto authored: pattern-matched "Stop" as different word, not as same failure-shape. The two-axiom test is precise: **pay attention** would have caught "Stop = Holding"; **remember when** would have caught "Otto authored the rule yesterday." The discipline that catches the failure IS the two axioms operationalized. + +**Most-load-bearing addition for future-Otto**: the two-axiom reduction is a working hypothesis for the entire factory's substrate-engineering stack. When future-Otto evaluates a substrate landing, the test is: which axiom (or both) does this serve? If neither and no DBSP composition either, candidate for new axiom OR decorative substrate. Apply alongside F#-anchor (PR #2840) + bandwidth-served falsifier (`.claude/rules/bandwidth-served-falsifier.md`) for full evaluation. + +--- + ## 2026-05-13 update โ€” META-LOOP recognition + middle path + cascade pattern + 8 peer-call wrappers **Substrate added since 2026-05-05 last revision** (canonical pointers):