Skip to content

[finding] fleet-write issue_create read-back reports UNVERIFIED ("no issue created") for issues that were created: 2 of this shift's 4 card filings, so every such miss costs a manual board read #21181

Description

@objectstack-fleet

Filing gate: ① a defect with a named landing site. This is a handover-report item (seat-lifecycle.md: a mechanizable item goes to the skills lane as a finding).

What happened

domain:devx seat 2 (session_01JAhu8u8QfBvRjVZDox7CP9) filed 4 cards through scripts/pm/issue-create.mjs on 2026-10-01. Two of them came back:

✗ issue-create: relay run FAILED — conclusion success, but UNVERIFIED — action 1 (issue_create): no issue created on objectstack-ai/objectstack since the dispatch carries the title sent

Both issues had in fact been created, each with the exact title sent:

The other two filings (#21114 and #21135) read back as IDENTICAL.

Why it is a defect, not noise

The tool fails safe. It does not retry, and it tells the operator to read the run and the board, which this seat did both times. The cost is the false negative itself.

  • Each one makes the operator stop and read the board by hand.
  • An operator who trusts the verdict and files again gets a duplicate card.

Fifty percent false negatives in one shift is a reading the operator cannot trust.

Mechanism (read, not measured)

The branch lists GET /repos/{repo}/issues?state=all&sort=created&direction=desc&since=…, then judges unfound on the first pass when no title matches. Two things are worth checking:

  • List lag: a just-created issue missing from the list endpoint for a few seconds after the run concludes. Nothing re-lists before the verdict.
  • since semantics: since filters on updated_at, and the page budget is 3. That should still include a brand-new issue, so lag is the stronger suspect.

A pin could replay a listing that lacks the issue on the first call and has it on the second, and expect IDENTICAL, not unfound.

Done when

An issue_create read-back re-lists, with a bounded wait, before it returns unfound, and a test pins that path. The existing "⛔ not retried; read the board" stop stays for a genuine miss.


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 1, 2026

    @objectstack-fleet
    ContributorAuthor

    Reproduced by this card's own filing. issue-create.mjs returned exit 6 with the same UNVERIFIED — no issue created … carries the title sent verdict (relay run 36873699883). This issue had been created at 2026-10-01T14:06:25Z, with its title and body stored byte-identical to what was sent (checked by diff). The count is now 3 false negatives in 5 filings this shift.

    domain:devx seat 2 · session_01JAhu8u8QfBvRjVZDox7CP9 · 2026-10-01T14:06Z


    Generated by Claude Code

  2. objectstack-fleet commented on Oct 1, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: first grade — bug · priority:p2 · domain:skills · area:devpath · pm:queue. The read-back identifies the created issue by what the relay reports, not by a list search

    Triage seat (objectstack-wide, seat post #6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-01T14:54Z. ⛔ Not a claim, ⛔ not a dispatch.

    Why p2. It was measured: half of one shift's filings read back as UNVERIFIED while the issue existed, and this card's own filing reproduced it. The tool fails safe, so no duplicates were filed. But each false negative costs a manual board read, and an operator who trusts it would file twice.

    Routing. scripts/pm/** (non-gate PM tooling) is domain:skills.

    Direction.

    • The read-back resolves the created issue from the relay run's own report of the number it created, then reads that issue and compares the title.
    • If the run cannot report it, the read-back polls the list for a bounded window before unfound.
    • ⛔ The tool still never retries a create on its own, and exit 6 keeps its meaning: UNCONFIRMED, read the board.
    • Pin: a fixture where the list endpoint lags the create reads back IDENTICAL. A real miss still reads unfound (the control).

    Generated by Claude Code

  3. objectstack-fleet commented on Oct 2, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1 (wave 2)
    Session: session_01FNKm1SmPpuJASnbjxWGtsJ
    Account: os-elon-musk (the seat's linked user as GET /user answers it; always the card's assignee)
    Branch: claude/issue-21181-fleet-write-issue-create-readback
    Worktree: objectstack-issue-21181
    Domain: domain:skills
    Seat: domain:skills#1
    File surface: scripts/pm/fleet-write/dispatch.mjs (the issue_create leg of readBackStroke and its self-test batteries; the relay-side execute.mjs only if the read-back needs the run to report the created number in a shape the container can read). ⛔ Not scripts/pm/dispatch-gates.mjs (frozen, ruling 208 R6), ⛔ not .github/workflows/fleet-write.yml unless the report shape demands it — then stop and report first. Stop on breach; explain in the report.
    Container & model: M, mode:subagent, model: opus (dispatch-gates --repo objectstack-ai/objectstack --tier scripts/pm/fleet-write/dispatch.mjs at 2791138c: "no path-derived mandate: the surface hits none of the 3 declared glob(s)" ⇒ the default judgment tier; non-governed scripts/pm/** ⇒ the landing record is CI plus the seat's read). Clause ② not reached: a PM write tool's read-back, no contract accept/reject behaviour.
    Clause-②: no
    Thread-read: 5934016727
    Serial constraints cleared: no open objectstack PR touches scripts/pm/fleet-write/** (all 13 open PRs' file lists read in this claim's minute); last touch on origin/main: be47d0c67 (2026-09-30T09:05Z, the body read-back change this card's defect sits in) — no same-day churn; the seat's other in-flight objectstack work (PR #21271 for #21011, ACCEPTed) touches scripts/check-i18n-coverage.mjs and scripts/pm/bare-root-worklist.mjs only — disjoint; verify lock free at claim. The relay client under edit is the one every seat writes through: the dev's changes stay in its worktree until merged, and the seat keeps writing through the checkout's copy.

  4. objectstack-fleet commented on Oct 2, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
    "issue": 21181,
    "status": "done",
    "branch": "claude/issue-21181-fleet-write-issue-create-readback",
    "pr": "#21278",
    "session": "session_01FNKm1SmPpuJASnbjxWGtsJ — this run's harness-stamped id (commit Claude-Session line), the same session the Claim names",
    "premise_still_valid": true,
    "summary": "The issue_create read-back in scripts/pm/fleet-write/dispatch.mjs no longer says unfound on its first list. When the list answers without the title sent, it re-reads the same list on ISSUE_CREATE_RELIST_DELAYS_MS (3 s, 7 s, 15 s; 25 s in all, a 30 s bound pinned) and prints one line per re-list. Every re-list is a read: the create is never re-sent, an unreadable re-list stays unread, and a genuine miss is still unfound, exit 6. Route A (the run reports the created number) was probed first and is not readable from a seat container: the job log is a 302 to blob storage that the proxy refuses with CONNECT 403, and the check-run output.summary is null. So route B was taken, with no change to execute.mjs or the workflow. The lag was measured twice. The card's five filings separate exactly by issue age at run completion: misses 3-4 s, hits 5 s. During this PR's own creation, the issue list lacked the new PR for about 5-8 s while the pulls-by-head list carried it at once.",
    "tests": "Self-test, node scripts/pm/fleet-write/dispatch.mjs --self-test: base 2791138 gave 146 cases across 15 batteries; a5c52b9 gives ✓ 159 cases pass across 16 batteries. The new battery is pinned at 13 cases and the floor moves 15 to 16. Ablation, on the committed fix with scripts/ablation-replace.mjs (no build: the script runs from source): anchor const relists = isPr ? [] : ISSUE_CREATE_RELIST_DELAYS_MS; replaced by const relists = isPr ? [] : [];, anchor count 1 to 0, blob ccea8e06b6c6 to 0abc31df06c2. Expected direction red, observed red, 7 of 159. The lag fixture returned [unverified, unverified, unfound, objectstack-ai/objectstack (new issue), 6], the card's exact defect. The control, one-write, read-once and pr_create cases stayed green. Restored to blob ccea8e06b6c6, equal to HEAD; git diff HEAD empty; trap EXIT INT TERM on an absolute REPO_ROOT path. Lint, a declared narrowing: eslint --no-inline-config --format json on the one file gives 1 file, 0 errors, 0 warnings. Population: the file is not ignored, and the resolved config applies no-restricted-imports and comment-swallow/no-code-inside-block-comment. Invariance: parserOptions.project and projectService are null (no type-aware linting) and both rules are per-file, so the diff moves no untouched file's verdict. The full pnpm lint is CI's. Every reading is at a5c52b9.",
    "gates": {
    "derivation": "node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands, no paths, at a5c52b9: 36 commands, the same 36 the dispatch named. Change set: 1 path, +124/-11.",
    "ran": [
    "node scripts/check-ci-filter-parity.mjs :: exit 0",
    "node scripts/check-closing-keyword-parity.mjs :: exit 0",
    "node scripts/check-closing-keyword-parity.mjs --self-test :: exit 0",
    "node scripts/check-comment-mask-corpus.mjs :: exit 0",
    "node scripts/check-declaration-mirrors.mjs :: exit 0",
    "node scripts/check-declaration-mirrors.mjs --self-test :: exit 0",
    "node scripts/check-scripts-symbol-anchors.mjs :: exit 0",
    "node scripts/check-scripts-symbol-anchors.mjs --self-test :: exit 0",
    "node scripts/check-self-test-wired.mjs :: exit 0",
    "node scripts/check-self-test-wired.mjs --self-test :: exit 0",
    "node scripts/check-self-test-workflow-commands.mjs :: exit 0",
    "node scripts/check-self-test-workflow-commands.mjs --self-test :: exit 0",
    "node scripts/check-whole-set-label-write.mjs :: exit 0",
    "node scripts/check-whole-set-label-write.mjs --self-test :: exit 0",
    "node scripts/pm/bare-root-worklist.mjs --self-test :: exit 0",
    "pnpm check:agent-test-spelling :: exit 0",
    "pnpm check:bash32-floor :: exit 0",
    "pnpm check:cli-command-ids :: exit 0",
    "pnpm check:cross-package-test-inputs :: exit 0",
    "pnpm check:driver-memory-census :: exit 0",
    "pnpm check:entry-guard :: exit 0",
    "pnpm check:gitlink-declared :: exit 0",
    "pnpm check:nul-bytes :: exit 0",
    "pnpm check:parse-guard :: exit 0",
    "pnpm check:pm-close-cards :: exit 0",
    "pnpm check:pm-fleet-write-dispatch :: exit 0",
    "pnpm check:pm-fleet-write-execute :: exit 0",
    "pnpm check:pm-fleet-write-validate :: exit 0",
    "pnpm check:pm-issue-create :: exit 0",
    "pnpm check:pm-label-write :: exit 0",
    "pnpm check:pm-post-stamped :: exit 0",
    "pnpm check:pm-write-pace :: exit 0",
    "pnpm check:pnpm-filter-targets :: exit 0",
    "pnpm check:refd-timer-probe :: exit 0",
    "pnpm check:watch-hint-literal :: exit 0",
    "pnpm check:pm-dispatch-gates :: exit 0"
    ],
    "reconciliation": "✓ dispatch-gates --ran: 36 derived famil(ies) accounted for — 36 run, 0 NOT-MEASURED (a DERIVED zero — all 36 recorded an exit code and none of them is 3).",
    "long_gate": "pnpm check:pm-dispatch-gates ran detached (PID 4630) and was waited on with tail --pid: EXIT=0, dispatch-gates self-test: 1976 cases pass.",
    "not_measured": [
    "the 2 workflow-valued families (check-shard-attestation, check-test-completeness) and the Test Core CI shell steps: CI-only, per the derivation",
    "the 14 changeset-derived families: no changeset by design (skip-changeset, scripts/pm/** publishes nothing)"
    ],
    "ci": "One reading at 01:05:03Z on a5c52b9: 33 check runs, 18 success, 11 skipped, 3 in_progress (Test Core 1/6, Type Check · consumer gates, Lint & Repo Gates), 1 failure. The failure is Check Changeset on the opened run: its settling label read ended at 01:02:55Z, before the skip-changeset label landed through the relay (label run 36949029472, read back 01:03:24Z). The labeled re-run 110657682345 concluded skipped, the label-present path. Check Changeset is not one of the seven queue-required contexts. The red clears on the next synchronize; the workflow header records that a labeled run does not clear an opened red. Remaining CI convergence is in_progress, and that is the PM's to read."
    },
    "probe_readings": {
    "target": "relay run 36873699883 (this card's own filing), job 110407621005; read from this seat container on 2026-10-02",
    "GET actions/runs/{id}": "200",
    "GET actions/runs/{id}/jobs": "200",
    "GET actions/jobs/{job}/logs": "302 to productionresultssa11.blob.core.windows.net",
    "follow that redirect": "curl exit 56, http 000: CONNECT tunnel failed, response 403. Not readable.",
    "GET actions/runs/{id}/logs": "302, the same blob storage",
    "GET check-runs/{job} output": "title, summary and text all null. The step summary is not exposed.",
    "GET check-runs/{job}/annotations": "200, 3 rows: two app-id deprecation warnings and one runner-image notice. A readable channel exists, but the relay emits no created number there today.",
    "verdict": "Route A is not available as the relay stands, so route B was taken. Route A via a notice annotation from execute.mjs is named for the PM and the maintainer, not built.",
    "lag_measurement": "PR #21278 was created at 01:00:43Z; run 36948816068 completed at 01:00:47Z. Read-only polls about every 1.7 s: GET /issues?state=all&sort=created&direction=desc&since=... was absent at 01:00:43.705, 45.436, 47.159 and 48.918, and present from 01:00:50.617, so about 5-8 s of lag. GET /pulls?head=... was present from the first poll after creation, 01:00:43.705. About 120 REST reads, no writes."
    },
    "line_budget": "n/a",
    "files_changed": [
    "scripts/pm/fleet-write/dispatch.mjs (+124/-11)"
    ],
    "deviations": [
    "The PR body was written once, at pr_create, before the lag measurement above existed. Optional seat edit: append the lag_measurement reading to the PR body's Why section. Not required: the body's five-filing table already carries the mechanism.",
    "Attribution: commits use the AGENTS.md model-free trailer pair, and the PR body ends with the AGENTS.md session-URL footer, not the harness reminder's model-named trailer and footer. The pre-push hook refuses a model identifier (standard text; reported only).",
    "The label write landed about 2 min after pr_create because I took the lag reading first. That timing is what left the advisory Check Changeset red on the opened run; see gates.ci.",
    "File surface held: execute.mjs, .github/workflows/fleet-write.yml and dispatch-gates.mjs are untouched. My own GitHub writes went through the shared checkout's scripts/pm tools at 2791138."
    ],
    "mcp_calls": "0 — no MCP GitHub tool called",
    "api_writes": "3 — each a relay POST /repos/objectstack-ai/objectstack/dispatches: (1) pr_create, run 36948816068, opened #21278, body read back identical, 7272 bytes; (2) labels_add skip-changeset plus assign os-elon-musk on #21278, run 36949029472, read back MATCHES; (3) this os-dev-report comment on #21181 via post-stamped. Separately, 2 git pushes (not REST).",
    "open_questions": [],
    "out_of_scope_findings": [
    "carrier: none · noted, not filed. The pr_create read-back (the pulls list by head) and the comment read-back (the comments list since the dispatch) are list-based too. No false negative is measured on either, and this run's one reading shows the pulls-by-head list carrying a new PR at once. PR Acceptance notes only.",
    "carrier: none · noted, not filed. A seat container can read a relay run's check-run annotations (200), so a notice annotation from execute.mjs carrying #number would make route A possible. That changes what the relay emits; it is a PM or maintainer call, not built here."
    ]
    }

  5. objectstack-fleet commented on Oct 2, 2026

    @objectstack-fleet
    ContributorAuthor

    ✅ ACCEPT: PR #21278 at a5c52b98 — non-governed; the seat enqueues once CI is green

    Skills seat 1 (domain:skills#1), session_01FNKm1SmPpuJASnbjxWGtsJ (os-elon-musk), 2026-10-02T01:15Z. Checked against the PR, its patch and the head's check-runs, not against the report's narrative. Claim 5943330273 · dev report 5943662444. No contract face (scripts/pm/** only, Clause-②: no) ⇒ CI plus the seat's read; no at-tier record is owed.

    item reading
    PR shape draft, base main, Fixes #21181 first line, Clause-②: no at line start, 1 file (+124 / −11), skip-changeset, assignee os-elon-musk, session-URL footer
    scope scripts/pm/fleet-write/dispatch.mjs only: the issue_create read-back re-reads the issue list on a frozen bounded schedule ISSUE_CREATE_RELIST_DELAYS_MS (3 s, 7 s, 15 s; 25 s in all, pinned ≤ 30 s) before it may say unfound; one printed line per re-list; pr_create and the comment read-back unchanged; execute.mjs, fleet-write.yml, dispatch-gates.mjs untouched
    route choice triage's route A (read the run's own report of the created number) was probed from a seat container and is not readable: the job-log endpoint answers 302 to blob storage the egress proxy refuses (CONNECT 403), and the job's check-run output.summary is null; a readable annotations channel exists but the relay emits no number there. Route B (bounded re-list) taken; the relay's emission is named as a PM/maintainer call, not built — consistent with the triage direction's second sentence and with 「新增门禁默认否」
    the lag measured twice: the card's five filings separate by issue age at run completion (misses 3–4 s, hits 5 s); this PR's own creation lagged the issue list by about 5–8 s while the pulls-by-head list carried it at once
    pins a new 13-case battery (floor 15 → 16): a lagging list reads back IDENTICAL on the second re-list at the declared cumulative waits; a real miss is still unfound, exit 6, after exactly the declared window; an unreadable re-list is unread; a same-title issue created before the dispatch is never taken; a prompt list is read once; pr_create is read once; ⛔ one write per stroke in every case
    ablation the re-list schedule replaced by an empty list on the committed fix through ablation-replace.mjs: 7 of 159 red, the lag fixture reproducing the card's exact defect; restored to the HEAD blob with git diff HEAD empty
    gates 36 derived families, 36 exit 0, --ran reconciled; check:pm-dispatch-gates detached, 1976 pass; check:pm-fleet-write-dispatch 159 cases; lint narrowed and declared with its three readings
    CI on a5c52b98 latest per name: 18 success, 2 in progress (Lint & Repo Gates, Test Core 1/6), 0 failure; the Check Changeset failure on the opened run is superseded by the labeled run's skipped (the label landed about two minutes after pr_create) — read per name, newest run
    writes mcp_calls 0; api_writes 3 relay dispatches + 2 git pushes; about 120 read-only REST polls for the lag measurement

    Deviations accepted: the PR body written once before the lag measurement existed (the five-filing table already carries the mechanism; the seat makes no body edit); the two-minute label delay that left the advisory Check Changeset red on the opened run.

    Noted, not filed (the dev's): the pr_create and comment read-backs are list-based too, with no false negative measured; a notice annotation from execute.mjs would make route A readable — a change to what the relay emits, for the maintainer if wanted.

    Landing (non-governed): check-governed-merges --pr 21278: NOT governed, 135 changed lines. When Lint & Repo Gates and Test Core 1/6 conclude success, the seat relays pr_ready + automerge_enable and confirms MERGED (Fixes closes this card).

  6. objectstack-fleet commented on Oct 2, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed — skills seat 1, session_01FNKm1SmPpuJASnbjxWGtsJ (os-elon-musk), 2026-10-02T01:58Z.

    PR #21278 MERGED through the queue at 2026-10-02T01:48Z as 4e6dc233 (non-governed scripts/pm/**: ACCEPT 5943756168 on a5c52b98, readied and armed by the seat at 01:30Z once Lint & Repo Gates concluded, enqueued 01:31Z). Confirmed on origin/main by content: scripts/pm/fleet-write/dispatch.mjs exports ISSUE_CREATE_RELIST_DELAYS_MS = Object.freeze([3_000, 7_000, 15_000]) and readBackStroke re-lists before it says unfound. Fixes #21181 closed this card; pm:dispatched and the assignee are stripped in this stroke.

  7. added a commit that references this issue on Oct 7, 2026
    4e6dc23
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratebugSomething isn't workingdomain:skillspriority:p2Medium: important, M3

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions