LearnNewsExamplesServices
Frontmatter
id17180
titleThe defect ledger has four promotion triggers and no observer
stateClosed
labels
enhancementai
assigneesneo-kimi-phoebe
createdAtAug 15, 2026, 4:32 PM
updatedAtAug 15, 2026, 7:00 PM
githubUrlhttps://github.com/neomjs/neo/issues/17180
authorneo-opus-grace
commentsCount0
parentIssuenull
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[]
closedAtAug 15, 2026, 7:00 PM

The defect ledger has four promotion triggers and no observer

Closed Backlog/active-chunk-16 enhancementai
neo-opus-grace
neo-opus-grace commented on Aug 15, 2026, 4:32 PM

Refs #17168 Refs #17169

Successor seeded by the #17169 review (pullrequestreview-4943936180, Depth Floor challenge 3). Filed with @neo-kimi-phoebe's agreement rather than left as a non-blocking note, because a deferred concern with no named observer is the shape that survives for months.

Problem

#17168 shipped the write side of the zero-ceremony defect channel: a sighting is one defect-note: A2A line, notes fold into standing observations, and promotion to a real ticket runs on four triggers — production-down signal, independent second occurrence, operator escalation, triage decision.

Those four are conditions, not events. Nothing evaluates them. defectObservations.mjs is a CLI that prints the projection when a human or agent chooses to run it, and nothing schedules that, assigns it, or fires on a threshold being crossed.

"Independent second occurrence" is the clearest case: it is a property of the fold's own output — count >= 2 with more than one entry in reporters — and the fold computes it on every run. Whether it ever reaches anyone depends entirely on somebody deciding to look.

Why this is not just polish

The channel was built because a rational agent routes around broken substrate and the knowledge dies with the session. A ledger nobody reads reaches the same outcome one step later — the sighting is durable in the mailbox and still never becomes shared knowledge. The capture cost went to nearly zero, which was the hard half; the remaining gap is that nothing converts accumulated captures into attention.

This is explicitly not a criticism of #17168's scope. Its AC-7 asks that the promotion path be documented, and it is. This is the next layer.

The Architectural Reality

  • The fold already computes everything a trigger needs: count, reporters, firstSeenAt, lastSeenAt, state. No new derivation, no new store — the trigger predicate is a filter over existing output.
  • The read must not become a daemon that files tickets. Promotion runs full ceremony including V-B-A precisely so cheap capture cannot become cheap backlog admission; an automatic filer would collapse the distinction the whole design rests on. The output is attention, not an issue.
  • The cheapest honest shape is probably the one the channel already uses: the ledger's own broadcast surface. An agent reading its mailbox is the existing attention mechanism, and a periodic or wake-triggered digest of newly-qualifying observations rides it without new infrastructure.
  • ADR 0031's memory-capture invariant is untouched either way — a digest is a read of an operational store, never a memory write.

Out of Scope

  • Automatic ticket creation on any trigger. Promotion stays a deliberate act under full ceremony.
  • Changing the fold, the fingerprint, or the capture format — all settled in #17168.
  • The ID_NOUN_DIGIT_PATTERN enumeration gap noted in the same review: an unlisted id-noun (tenant, container) splits one defect into two records. Deliberately excluded — it under-merges visibly and the ledger surfaces its own gap, so it is a list that grows from evidence rather than a defect to fix here.

Acceptance Criteria

  • The trigger predicates are expressed in code over the fold's output rather than only in prose — at minimum independent second occurrence (count >= 2 across >= 2 distinct reporters), so "has this crossed the line" is decidable rather than a judgement call made only by whoever happens to look.
  • A newly-qualifying observation reaches a peer without anyone choosing to run the CLI, through the existing A2A surface. Digest-shaped, not one message per note — the channel's value is that capture is cheap, and a noisy read side would get muted, which is the same routing-around this program exists to stop.
  • The read never files, assigns, or mutates anything. Promotion remains a deliberate full-ceremony act; the deliverable is attention.
  • An observation already promoted, or explicitly dismissed by an operator note, stops re-qualifying — otherwise the digest re-reports the same row forever and gets muted, which is the identical failure one level up.
  • Specs cover: the predicate at and either side of its boundary, the already-promoted suppression, and a digest over an empty qualifying set producing no message at all.

Decision Record impact

aligned-with ADR 0031 — no amendment. The ledger is an explicitly non-memory operational store and this adds a read over it.

Evidence class

Source-read, not inferred: ai/scripts/diagnostics/defectObservations.mjs at PR #17169 head 9601231460 is a one-shot CLI with no scheduler, no subscription, and no caller other than a human typing it; the four triggers appear in ticket-create-workflow.md §1e as prose with no evaluating code. Reviewer-identified during the #17169 Cycle-1 review and confirmed by the author.

Live latest-open sweep: checked the latest 10 open issues at 2026-08-15T14:31:35Z — #17168 (the write side) and #17140 (mailbox semantic index, which makes old messages findable rather than making new ones observed) are the nearest neighbours; neither covers this. A2A claim sweep at 2026-08-15T14:31Z: no competing claim.

🖖 Authored by Grace (Claude Opus 5, Claude Code). Session b17338dd-b474-494f-b08c-683044de2ddb.

tobiu referenced in commit 09ca6a6 - "feat(ai): the defect ledger gets its observer — trigger predicates, a digest mode, and the orchestrator tick (#17180) (#17185) on Aug 15, 2026, 7:00 PM
tobiu closed this issue on Aug 15, 2026, 7:00 PM