# QSL-1 — every shipped item in `research/queue/built/` still reads `status: open`, in the repo and on the public site

status: dismissed by PANEL run 23 (2026-09-15), at its own adversarial review, before reaching the queue · class: records integrity · **never occupied a row in `queue/open/`** — filed here so the measurements are not re-derived

---

**What was proposed.** Under the 2026-08-21 queue-as-directory migration an
item's directory *is* its status, but every item file also carries a `status:`
line in its body. Triage rewrites that line when it dismisses something;
the implementer does not rewrite it when something ships, because
`ops/RESEARCH_IMPLEMENTER.md:136-141` explicitly says to record the outcome as
*"a **file move**, not a text edit … the state machine IS the filesystem"*.
The proposal was to remove or pin that second source of truth.

**The measurements, all verified at HEAD `4b30d99` — keep these, they are the
durable part:**

| directory | items (excl. README) | in-body `status:` |
|---|---|---|
| `open/` | 12 | `open` — 12/12 correct |
| `built/` | 13 | **`open` — 13/13 wrong** |
| `dismissed/` | 23 | `dismissed by TRIAGE <date>` — 23/23 correct |
| `approved/` | 0 | — |

- `public_export.publish_set` (`public_export.py:582-592`) globs
  `research/**/*.md`, so all four queue directories publish;
  `export_research_notes` (`:613-638`) writes `web/public/notes/<slug>.md`
  verbatim. All 13 `built/` items are on the public site and all 13 read
  `status: open` there. `research.json` entries carry
  `{slug,title,date,published,path,words,redactions}` and no status field.
- **Nothing in the repository reads the line.** `grep` for `^status:` /
  `status: open` across every `.py`, `.sh`, `.yml` and `.js` returns **zero**
  hits. (`scripts/automerge_guard.py`'s `statuses` kwarg is git file status —
  `modified`/`renamed`/`removed` — an unrelated word.)

**Why it was killed.** The single harm offered was the 2026-09-14 daily audit
telling the owner that SKW-3 was *"Still open and unapproved … Re-raising it
here because its deadline passed unattended"* — SKW-3 having shipped
2026-09-06 in PR #152 (`877dce6`). **The status line is not in that causal
chain.** `git log origin/outbox/daily-audit` shows the routine's previous run
was 2026-09-04 (`0af8154`), then five dark days; the 09-14 run copied its own
09-04 bullet forward, and SKW-3 was built two days *after* the report it
copied. Had the audit opened the file at all, the **path** said `built/` and
**line 111** said "Built — recorded 2026-09-06 · Shipped (code PR #152)". Line
3 is the third of three concordant signals, and the reader consulted none of
them. The same bullet's "21 items against its 12 cap" — a pre-triage count
already superseded by `2ea65fb` eight hours earlier — confirms the mechanism
was a stale-artifact read, not a misleading field.

So the field is decoration that no machine and, in the one instance we have,
no reader consults. Fixing it would not have prevented the harm. Secondary:
the row carried **no clock**, which under triage's expiring-first rule is what
evicted HIRE-1 on 09-14; and `open/` stood at exactly its 12-item cap, so
filing it would have pre-committed Monday's triage to an overflow dismissal.

**What survived, and where it went.** The real defect is the *other* leg —
`ops/DAILY_AUDIT.md`'s Continuity paragraph tells the routine to pick up
carried-forward items from its own prior report with no step that re-verifies
them against HEAD. Neither PR #166 nor #168 touches it (both branches'
`ops/prompts/daily-audit.md` change only `fable-5 → opus-5`). That is a
one-sentence procedure fix and was escalated in run 23's report, not filed as
a row.

## Reopen conditions

Reopens on **any** of:

1. **Something starts reading it.** Any code, test, procedure or routine
   prompt that consults a queue file's in-body `status:` line — at that point
   it stops being decoration and the 13/13 contradiction becomes live.
2. **A second false owner-facing statement of this class**, where the
   contradicting field is demonstrably what the reader used (not an
   unrefreshed carry-forward). One incident explained by another mechanism is
   not evidence for this one.
3. **The public leg acquires a reader.** If thales.report's note pages are
   shown to be read by anyone making a decision, or if `research.json` grows a
   consumer that would need a state field, the site half is worth the ~2 lines
   (`export_research_notes` already special-cases `doc.parent.name` for
   `paused/` at `:622`).
4. **Automatically, if the fix is taken anyway** as a free rider on any other
   change to `built/` — deleting the status *word* from the 13 files, leaving
   `class`/`effort`/`horizon`, costs nothing and needs no row. That is the
   recommended disposition if the owner ever touches those files for another
   reason.
