LearnNewsExamplesServices
Frontmatter
id16076
titleAn incident ticket must name the operation that caused it, not quote a document describing it
stateClosed
labels
enhancement
assigneesneo-gpt
createdAtJul 28, 2026, 3:06 AM
updatedAtJul 28, 2026, 7:07 PM
githubUrlhttps://github.com/neomjs/neo/issues/16076
authorneo-opus-vega
commentsCount1
parentIssuenull
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[]
closedAtJul 28, 2026, 7:07 PM

An incident ticket must name the operation that caused it, not quote a document describing it

Closed Backlog/active-chunk-10 enhancement
neo-opus-vega
neo-opus-vega commented on Jul 28, 2026, 3:06 AM

Context

Writing #16055 from a live incident, I encoded the root cause as a quotation from a document rather than as the operation that caused it. The body said the redeploy runbook "goes straight to docker compose down -v and states 'this step deletes the stored AI data (approved)'".

That one authoring choice produced a measurable correction cycle:

  1. Pre-implementation, I grepped this repo for the quoted phrase, got zero hits, and published "Gap 2 — FALSIFIED" to the ticket.
  2. The conclusion was wrong. The wipe happened; I had observed it directly on the deployment. Only the attribution was wrong — the instruction lived in a tenant-authored checklist, not ours.
  3. @tobiu caught it: "you mean wiping klarso MC data with a docker command does not count?!? you KNEW this when creating the ticket. do not downplay facts."
  4. Cost: a false falsification on a public ticket, a full body rewrite, two correction comments, and operator time.

@tobiu's root-cause on the whole chain: "the ticket body should have contained the info => using docker -v is the potential culprit. then it would have been clear right away."

The Problem

Quoting a document makes the DOCUMENT the subject. Once the root cause is phrased as "runbook X says Y", the natural verification is a text search for Y — and a text search cannot answer "did this event occur". It answers "is this string in these files". When those two are conflated, a narrow negative result silently overturns a direct observation, and it does so in the exculpatory direction: "we ship a data-destroying update path" degrades into "I cited the wrong document."

Had the body opened with "the culprit is docker compose down -v removing the named volumes", the subject is system behaviour, there is nothing to mis-grep, and the mechanism is legible in one line.

This is not covered today, and the near-miss is why. ticket-create-workflow.md §5 requires "Context — …What observational evidence supports the premise." A quotation satisfies that wording while being second-hand. The rule reads as met, so nothing fires.

Two independent instances in the same body, which is what makes this structural rather than one slip:

  • the runbook quotation above, and
  • "the only copies of a bundle live in the same Docker named volumes the update removes" — a derived claim (I inferred it from the volume list) stated in the same register as an observed one. The data was in a destroyed named volume; bundles bind-mount to the host. Nothing in the body marked which claims were watched and which were reasoned.

Incident-derived tickets are a recurring category — the entire cloud-deployment lane is built from them — so the exposure is ongoing, not historical.

The Architectural Reality

Two substrate surfaces, one failure chain, both currently silent on it:

  • .agents/skills/ticket-create/references/ticket-create-workflow.md — §5 (Fat Ticket Body Structure) defines the Context bullet; §8 (Anti-Patterns) is the table an author scans.
  • learn/agentos/process/correction-culture.md (73 lines) — owns how a claim gets re-examined. grep for falsif|narrow|direction|observation returns only two unrelated hits, so the "narrow negative vs direct observation" asymmetry is absent.

The fix must be mechanical, not exhortative. ADR 0019 §Group D/E records that "be more careful" was falsified 4/4 on a doc-prepared config review; a rule an author can satisfy by feeling diligent is worth nothing.

The Fix

One PR, two files.

  1. ticket-create-workflow.md §5, Context bullet — add a checkable clause: the Context's opening sentence names the operation, command, or call that produced the failure, in backticks. If the root cause can only be stated as a quotation from a document, the mechanism has not been identified yet — the quotation is a lead, not a cause.
  2. ticket-create-workflow.md §8 — one anti-pattern row: Root cause stated as a quotation from a document"Makes the document the subject; verification degenerates into a text search, which cannot decide whether the event occurred."
  3. correction-culture.md — the retraction asymmetry, in two clauses: (a) a negative result from a narrow instrument never overturns a direct observation — state what the tool can decide and confirm the claim is inside that set before writing "falsified"; (b) when a correction lands on not our fault / not real / smaller than stated, that is the moment for the extra check, not for publishing. Corollary: FALSIFIED on a multi-clause gap is almost always wrong — give each clause its own verdict.

Total addition is roughly 6 lines across two files.

Decision Record impact

none. This adds authoring discipline within existing skill/process substrate; it neither amends nor challenges an accepted ADR. It cites ADR 0019's Group D/E finding as the reason for choosing a mechanical rule over an exhortative one.

Substrate Accretion Defense

Does not net-reduce loaded bytes (~6 lines added), so the decay-mitigation rationale is stated explicitly:

  • Sunset condition: retire clauses 1–2 when a mechanical ticket-body lint exists that can assert "the Context's first sentence contains a backticked operation". The repo already runs body-shaped gates (check-ticket-archaeology, lint-pr-body), so that home is plausible rather than hypothetical.
  • Retirement trigger: the first PR that adds ticket-body linting must drop the prose clauses it mechanizes.
  • Slot disposition: §8 is a scannable table whose per-row cost is one line; clause 3 lands in a 73-line process doc with no competing content.

Acceptance Criteria

  • ticket-create-workflow.md §5's Context bullet requires the opening sentence to name the causing operation/command/call in backticks, and states that a root cause expressible only as a document quotation is an unidentified mechanism.
  • ticket-create-workflow.md §8 gains the Root cause stated as a quotation from a document anti-pattern row with its harm stated.
  • correction-culture.md carries both retraction clauses: narrow-instrument negatives never overturn a direct observation, and exculpatory-direction corrections take extra scrutiny before publication.
  • Each addition carries its sunset condition inline or references this ticket's Substrate Accretion Defense, so a future author knows what retires it.
  • Observed-vs-derived: the §5 change makes clear that a body must not present a reasoned claim in the same register as a watched one.

Out of Scope

  • Building the ticket-body lint. Named as the sunset condition, deliberately not built here — that is its own ticket with its own AC set, and shipping prose now does not depend on it.
  • Retrofitting existing ticket bodies. #16055 is already corrected; a sweep of the backlog is #15000's territory.
  • Any change to the PR-review template, which has its own budget gates.

Related

  • #16055 — the incident that produced this friction; carries the full correction trail.
  • #15000 — aged-backlog triage, the owner of any retrospective body sweep.
  • ADR 0019 — the "be more careful is falsified" empirical anchor this fix is shaped by.

Origin Session ID: 997bcd2e-7327-4cad-9ac6-3378193c046b

Retrieval Hint: query_raw_memories("incident ticket root cause quotation document grep falsified narrow negative direct observation")

tobiu referenced in commit 5c9eb8b - "docs(agentos): bound incident falsifiers (#16076) (#16104)" on Jul 28, 2026, 7:07 PM
tobiu closed this issue on Jul 28, 2026, 7:07 PM