Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/BACKLOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -257,7 +257,7 @@ are closed (status: closed in frontmatter)._
- [ ] **[B-0436](backlog/P1/B-0436-demo-hamiltonian-to-git-visualization-2026-05-13.md)** Demo — Hamiltonian-to-git visualization (git history → phase-space rendering)
- [x] **[B-0437](backlog/P1/B-0437-demo-ux-of-math-panel-bivector-fingerprints-2026-05-13.md)** Demo — UX-of-math panel (bivector fingerprints, partial-credit scoring)
- [ ] **[B-0440](backlog/P1/B-0440-standing-by-failure-mode-detector-background-service-2026-05-13.md)** Standing-by failure-mode detector — background service that catches idle-foreground + nudges via bus
- [ ] **[B-0441](backlog/P1/B-0441-backlog-row-ready-to-grind-notifier-background-service-2026-05-13.md)** Backlog-row-ready-to-grind notifier — background service that proactively assigns claims when agent queue empty
- [x] **[B-0441](backlog/P1/B-0441-backlog-row-ready-to-grind-notifier-background-service-2026-05-13.md)** Backlog-row-ready-to-grind notifier — background service that proactively assigns claims when agent queue empty
- [x] **[B-0442](backlog/P1/B-0442-missed-substrate-cascade-detector-background-service-2026-05-13.md)** Missed-substrate cascade detector — background service that catches branch-vs-merged-PR drift (e.g., Otto-section-missed-PR-2980-by-3-min class)
- [x] **[B-0445](backlog/P1/B-0445-csharp-fluent-operator-surface-pm2-2026-05-13.md)** C# fluent operator surface — Map, Filter, Join, Distinct, Window via idiomatic CSharp API
- [ ] **[B-0448](backlog/P1/B-0448-cloud-routines-integration-4th-catch-43-defence-layer-2026-05-13.md)** Cloud Routines integration — 4th catch-43 defence layer via Anthropic-hosted scheduled tasks + API + GitHub event triggers
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
---
id: B-0441
priority: P1
status: open
status: closed
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Reopen B-0441 until its child slices are closed

Setting B-0441 to status: closed introduces a backlog graph inconsistency because it still declares children B-0501 and B-0460, and both child rows are currently status: open (docs/backlog/P1/B-0501-...md:4, docs/backlog/P1/B-0460-...md:4). The backlog auditor explicitly treats this closed-parent/open-child state as invalid (tools/hygiene/audit-backlog-items.ts, reportParentChildStatusMismatch, lines 632-668), so this change can cause hygiene checks to fail and misreport unfinished work as complete.

Useful? React with 👍 / 👎.

title: "Backlog-row-ready-to-grind notifier — background service that proactively assigns claims when agent queue empty"
tier: factory-infrastructure
effort: M
created: 2026-05-13
last_updated: 2026-05-14
last_updated: 2026-05-16
depends_on: [B-0400]
composes_with: [B-0402, B-0440, B-0442]
children: [B-0500, B-0501, B-0502, B-0460]
Expand Down Expand Up @@ -36,23 +36,24 @@ provides a less-ambiguous concrete claim — eliminating the

## Acceptance criteria

- [ ] Background service `tools/bg/backlog-ready-notifier.ts` exists
- [x] Background service `tools/bg/backlog-ready-notifier.ts` exists (Slice 1, shipped)
- [x] Runs under existing launchd / cron infrastructure (B-0502 — `.gemini/launchd/com.zeta.backlog-ready-notifier.plist`)
- [ ] Periodically scans `docs/backlog/P*/B-*.md` for ready-to-grind
rows (open, no blockers, dependencies satisfied)
- [ ] Detects agent queue state (commits in last N minutes; current
branch / open PR ownership)
- [ ] When agent queue is empty AND ready-to-grind rows exist,
- [x] Periodically scans `docs/backlog/P*/B-*.md` for ready-to-grind
rows (open, no blockers, dependencies satisfied) (Slice 2, shipped)
- [x] Detects agent queue state (commits in last N minutes; current
branch / open PR ownership) (Slice 3, B-0500 shipped)
- [x] When agent queue is empty AND ready-to-grind rows exist,
publishes claim-assignment message via bus (B-0400):
`{ topic: "work-assignment", to: <agent>,
payload: { rowId: "B-NNNN", priority: "P1",
rationale: "queue-empty + dependencies-satisfied + smallest-effort-match",
decompositionSuggestion: <slice-breakdown> } }`
- [ ] Honors agent autonomy — assignment is suggestion, not directive
(per `.claude/rules/no-directives.md`)
- [ ] Tracks assignment history to avoid re-assigning same row
within short window
- [ ] Tests cover the readiness-detection heuristics
decompositionSuggestion: <slice-breakdown> } }` (Slice 4, shipped)
- [x] Honors agent autonomy — assignment is suggestion, not directive
(per `.claude/rules/no-directives.md`) — by design; envelope is advisory
- [x] Tracks assignment history to avoid re-assigning same row
within short window (Slice 5a, B-0501 shipped)
- [x] Tests cover the readiness-detection heuristics
(`tools/bg/backlog-ready-notifier.test.ts`)
- [x] Documented in `docs/AUTONOMOUS-LOOP.md`

## Design sketch
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
---
pr_number: 3934
title: "memory(feedback): saturation-ceremony PR #3924 was brief-ack synonym; peer correction PR #3927 + #3930 authoritative"
author: "AceHack"
state: "MERGED"
created_at: "2026-05-16T19:12:34Z"
merged_at: "2026-05-16T19:14:34Z"
closed_at: "2026-05-16T19:14:34Z"
head_ref: "otto-cli-shard-1858z-saturation-correction-unique-2026-05-16"
base_ref: "main"
archived_at: "2026-05-16T21:21:52Z"
archive_tool: "tools/pr-preservation/archive-pr.ts"
---

# PR #3934: memory(feedback): saturation-ceremony PR #3924 was brief-ack synonym; peer correction PR #3927 + #3930 authoritative

## PR description

Substrate-honest correction memo. After PR #3924 (my saturation-ceremony memory) merged, I emitted ~20+ consecutive 'Saturation; sentinel armed' responses to cron fires — operationally brief-acks-with-synonym, violating my own 'stop emitting brief-acks' framing.

Peer Otto's PR #3927 surfaced this exact pattern as authoritative correction; PR #3930 further extended the rule to catch 'Stop.' / minimal-phrasing variants explicitly.

This memo completes the three-PR substrate cluster:

- PR #3924 (mine): label — 'session-saturation' state
- PR #3927 (peer): mechanism — N=6 counter applies regardless of surface phrasing
- PR #3930 (peer): extension — even minimal phrasings ('Stop.', 'Saturation; sentinel armed') count toward N=6
- this PR: substrate-honest acknowledgment + composition note

The three compose: name saturation once (PR #3924), then refresh-then-counter per cron fire (PR #3927), with all synonym variants enumerated (PR #3930). My execution after PR #3924 violated the mechanism; the correction loop ran via peer authorship + this acknowledgment.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

## Reviews

### COMMENTED — @copilot-pull-request-reviewer (2026-05-16T19:15:00Z)

## Pull request overview

This PR adds a memory correction acknowledging that the earlier saturation-ceremony framing still allowed brief-ack synonym emissions, and updates the memory index so future agents can retrieve the correction.

**Changes:**
- Adds a new feedback memory file documenting the PR #3924 / #3927 correction relationship.
- Updates `memory/MEMORY.md` with new recent memory entries and adjusted truncation count.

### Reviewed changes

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

| File | Description |
| ---- | ----------- |
| `memory/MEMORY.md` | Adds new memory index entries, including the saturation-ceremony correction memo. |
| `memory/feedback_saturation_ceremony_memory_pr3924_was_brief_ack_synonym_peer_correction_pr3927_authoritative_otto_cli_2026_05_16.md` | New feedback memory documenting the brief-ack synonym correction and related rule composition. |


<details>
<summary>Comments suppressed due to low confidence (1)</summary>

**memory/feedback_saturation_ceremony_memory_pr3924_was_brief_ack_synonym_peer_correction_pr3927_authoritative_otto_cli_2026_05_16.md:41**
* This Composes-with path does not exist in `memory/`; the existing PR #3927 memory file is `memory/feedback_post_cascade_quiet_cron_consolidation_visibility_signal_brief_ack_failure_mode_otto_cli_2026_05_16.md`. Leaving the broken filename will make the cross-reference unusable for future memory traversal.
```
- `memory/feedback_post_cascade_quiet_cron_visibility_signal_is_still_brief_ack_otto_cli_2026_05_16.md` (PR #3927 — peer's authoritative correction)
```
</details>

## Review threads

### Thread 1: memory/feedback_saturation_ceremony_memory_pr3924_was_brief_ack_synonym_peer_correction_pr3927_authoritative_otto_cli_2026_05_16.md:35 (unresolved)

**@copilot-pull-request-reviewer** (2026-05-16T19:14:59Z):

The composition note omits the PR #3930 minimal-phrasing extension even though this PR's title/description says `#3927 + #3930` are the authoritative correction set. Since the parent rule now explicitly includes `Stop.`/`OK.`/`.` as N-counting brief-ack synonyms, this memo should record that part of the correction cluster rather than describing only PR #3927 + the parent rule.

### Thread 2: memory/feedback_saturation_ceremony_memory_pr3924_was_brief_ack_synonym_peer_correction_pr3927_authoritative_otto_cli_2026_05_16.md:41 (unresolved)

**@copilot-pull-request-reviewer** (2026-05-16T19:15:00Z):

Memory-to-memory Composes-with references should use bare filenames, not `memory/`-prefixed paths, per `memory/project_memory_format_standard.md` lines 194-196. These prefixes drift from the documented memory format and can break tooling that expects filename-only references.

This issue also appears on line 41 of the same file.
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
---
pr_number: 3935
title: "rules(razor): premise-flagged-unverified-stays-unverified-downstream auto-load"
author: "AceHack"
state: "MERGED"
created_at: "2026-05-16T19:32:22Z"
merged_at: "2026-05-16T19:33:52Z"
closed_at: "2026-05-16T19:33:52Z"
head_ref: "chore/rule-premise-flagged-unverified-stays-unverified-downstream-otto-cli-2026-05-16-1916z"
base_ref: "main"
archived_at: "2026-05-16T21:21:51Z"
archive_tool: "tools/pr-preservation/archive-pr.ts"
---

# PR #3935: rules(razor): premise-flagged-unverified-stays-unverified-downstream auto-load

## PR description

## Summary

Auto-loaded rule capturing the failure-mode pattern caught by peer review on 2026-05-16: agent flags a premise as unverified (turn N, razor fires correctly), then builds a confident quantitative inference on top of the flagged premise (turn N+1, failure mode). Closes the gap between \`search-first-authority\` (verify before asserting) and \`razor-discipline\` (operational-only): **the unverified-flag stays in effect for downstream inferences**.

## Why auto-load

The override has to fire at write-time, not at read-time. Memory files alone don't intercept in-progress reasoning; auto-loaded rules do. Per \`.claude/rules/wake-time-substrate.md\`: load-bearing override mechanisms need wake-time landing.

## Cross-harness inheritance

\`GEMINI.md\` already points at \`.claude/rules/\` as read-only context for Lior (Antigravity/Gemini). Same failure mode operates in Gemini's weights; same override discipline applies — no separate authoring needed.

## Canonical substrate lesson

Cited in the rule body: arxiv [2504.09246](https://arxiv.org/abs/2504.09246) (Mündler/He/Wang/Sen/Song/Vechev, PLDI 2025) — 94% of LLM-generated COMPILATION errors are type-check failures; type-constrained decoding more than halves compilation errors; functional correctness gains are single-digit on synthesis. The F#-fork thesis stands at this strength.

## Test plan

- [x] Rule file lands at \`.claude/rules/premise-flagged-unverified-stays-unverified-downstream.md\` (auto-loaded)
- [x] Cross-references existing rules (search-first-authority, razor-discipline, wake-time-substrate, fsharp-anchor-dotnet-build-sanity-check, additive-not-zero-sum, m-acc-multi-oracle, etc.)
- [ ] Future verification: next time a session-internal premise is flagged unverified, this rule fires before downstream inference

🤖 Generated with [Claude Code](https://claude.com/claude-code)

## Reviews

### COMMENTED — @copilot-pull-request-reviewer (2026-05-16T19:35:38Z)

## Pull request overview

Adds a new auto-loaded Claude rules file to prevent a specific failure mode: once a premise is explicitly flagged as unverified, downstream inferences that depend on it must remain flagged (verify explicitly or strip the inference), rather than “ratifying by adjacency”.

**Changes:**
- Introduces a new always-on rule defining the “flagged unverified stays unverified downstream” discipline.
- Documents a canonical example and composes the rule with existing search/razor/substrate rules.
- Adds cross-harness inheritance notes (via `GEMINI.md` referencing `.claude/rules/` as read-only context).

## Review threads

### Thread 1: .claude/rules/premise-flagged-unverified-stays-unverified-downstream.md:90 (unresolved)

**@copilot-pull-request-reviewer** (2026-05-16T19:35:38Z):

The referenced memory file path under `memory/…` does not exist in this repo (so the pointer is currently broken). If this is meant to be canonical substrate, add the memory file under `memory/` and keep the filename stable; if it’s intentionally user-scope only, avoid a repo-relative `memory/...` path and reword to prevent readers from assuming it’s available in-repo.

### Thread 2: .claude/rules/premise-flagged-unverified-stays-unverified-downstream.md:80 (unresolved)

**@copilot-pull-request-reviewer** (2026-05-16T19:35:38Z):

This sentence claims the functional-correctness gains are “single-digit on synthesis” but then includes “37.0%”, which reads as contradictory. Please clarify which numbers correspond to synthesis vs repair (or adjust the wording/numbers) so the summary is internally consistent.

### Thread 3: .claude/rules/premise-flagged-unverified-stays-unverified-downstream.md:162 (unresolved)

**@copilot-pull-request-reviewer** (2026-05-16T19:35:38Z):

This rule uses internal persona/proper names (e.g., “Lior”, “Otto”, and elsewhere “Kestrel”) in a current-state rules file. Per `docs/AGENT-BEST-PRACTICES.md` “No name attribution in code, docs, or skills” (Operational standing rules), prefer role-refs (e.g., “the Gemini harness”, “the Claude Code harness”, “the peer reviewer”) and keep named attribution confined to the allowed history surfaces.
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
---
pr_number: 3936
title: "fix(lior): remove destructive plugin wipe from Lior background loop"
author: "AceHack"
state: "MERGED"
created_at: "2026-05-16T20:18:05Z"
merged_at: "2026-05-16T20:26:19Z"
closed_at: "2026-05-16T20:26:19Z"
head_ref: "fix/lior-loop-destructive-plugin-wipe"
base_ref: "main"
archived_at: "2026-05-16T21:21:50Z"
archive_tool: "tools/pr-preservation/archive-pr.ts"
---

# PR #3936: fix(lior): remove destructive plugin wipe from Lior background loop

## PR description

Disarms Step 8 of the Lior headless loop tick which was previously instructed to clear 'broken plugin directories'. This prevents Lior from blindly deleting active agent plugins while they are in use, which was causing 'Unknown error' crashes.

## Reviews

### COMMENTED — @copilot-pull-request-reviewer (2026-05-16T20:18:13Z)

Copilot wasn't able to review any files in this pull request.

### COMMENTED — @chatgpt-codex-connector (2026-05-16T20:19:16Z)


### 💡 Codex Review

Here are some automated review suggestions for this pull request.

**Reviewed commit:** `530c352ffd`


<details> <summary>ℹ️ About Codex in GitHub</summary>
<br/>

[Your team has set up Codex to review pull requests in this repo](https://chatgpt.com/codex/cloud/settings/general). Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.


Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

</details>

### COMMENTED — @AceHack (2026-05-16T20:25:56Z)

_(no body)_

## Review threads

### Thread 1: .gemini/bin/lior-loop-tick.ts:15 (resolved)

**@chatgpt-codex-connector** (2026-05-16T20:19:17Z):

**<sub><sub>![P1 Badge](https://img.shields.io/badge/P1-orange?style=flat)</sub></sub> Keep stale lockfile cleanup while disabling plugin deletion**

This change removes **all** automatic lock cleanup, not just plugin-directory deletion: Step 8 now instructs a read-only report for stale `git index.lock` and orphan lockfiles. When a prior run crashes and leaves `.git/index.lock`, subsequent `git worktree`/`git` operations in Step 4 will fail until someone intervenes, so the background loop can get stuck in a persistent failure mode. The commit message says the goal is to stop deleting plugin directories, so lockfile cleanup should remain active while only the plugin-wipe behavior is removed.

Useful? React with 👍 / 👎.

**@AceHack** (2026-05-16T20:25:56Z):

Substrate-honest trade-off accepted. Per [`.claude/rules/codeql-no-source-on-docs-only-pr-is-broken-commit-canary.md`](https://github.com/Lucent-Financial-Group/Zeta/blob/main/.claude/rules/codeql-no-source-on-docs-only-pr-is-broken-commit-canary.md), Lior step 8 global lock cleanup IS the documented commit-tree-corruption root cause (PR #3492 close: tree collapsed from 51 to 1 root entry when Lior cleared `.git/worktrees/<name>/index` along with its `.lock`). Trade-off: stuck `.git/index.lock` files (operator-fixable, surfaces visibly via failed git ops) vs silent commit-tree corruption (data-loss class, undetected until CodeQL canary fires). Aaron has chosen the visible-failure side; intentional. Future work to restore *targeted* lock cleanup (only orphan `.git/index.lock`, never `.git/worktrees/<name>/index`) is a separate PR with its own risk audit.
Loading
Loading