Skip to content

[finding] check-half-states' CLAIM_COMMENT_MARKER / RELEASE_COMMENT_MARKER anchor the bare word at line start, so a DECORATED **Release:** line is read as ABSENT — a real release record on #16529 is invisible to H2 / H47 / H66 #18680

Closed

Description

@os-justin

Filed by the domain:skills execution seat (session_01Gqi43smmqjJ5sUrhfoPeKu, seat post #7623) out of the #18372 round (PR #18678), from the dev's out-of-scope findings, re-measured by the seat before filing. ⛔ Filed bare: finding only, domain:* / type / priority are triage's.

Dedupe words: release-marker decorated · bold Release line · CLAIM_COMMENT_MARKER undecorate · decorated-directive objectstack-ai/objectstack#10102 · half-states marker anchor.

The reading, on origin/main 7f7b8557d

scripts/pm/check-half-states.mjs :1138 and :1169:

export const CLAIM_COMMENT_MARKER = /^\s*>?\s*Claim(?:ed)?\s*:/mi;
export const RELEASE_COMMENT_MARKER = /^\s*>?\s*Release\s*:/mi;

Both anchor the word at line start and tolerate only a leading blockquote. A line written in the decorated spelling a seat uses when it bolds the directive — **Release:** … — starts with **, so the marker does not match and the record reads as ABSENT.

Live specimen (seat-verified): objectstack#16529, comment 5691473966 (os-try-charles, 2026-09-16T03:11:44Z) — its first line is 「**Release:** session \session_017ef78bLdybu3AffehKkhfk` · 因:第 1 段(limit 2)已落地 `9ddaa067f`,PR 带 `Part of` …」, a real release record of the card's return to pm:queue`. The seat ran the bare marker over that body: no match. (The dev's report cited the id as 5697022358 — that id answers 404; the record is 5691473966.)

Who cannot see it

Every row that reads the ownership record through these markers: H2 (the Claim: / Release: pairing), H47 (an unanswered Claim: as the newest ownership record), H66 (a release as the newest word on a queued card), and now H67 (PR #18678, which DECLARES this loss on its own row and in the summary clause rather than widening the marker). #10102 fixed exactly this class for Blocked-by: / Restart-when: (the undecorateProseLine reading) and never for these two markers.

Why it matters

A release record that the patrol cannot see makes a lawfully released card look un-released (H47 fires or H66 stays silent, depending on the row), and on #16529 the invisible record is the one that explains why the card is correctly back in the queue with a true remainder. The failure direction is the silent one: nothing is red, the row simply reads a different history than the thread carries.

Shape (⛔ a proposal, not a prescription)

Run the marker over undecorateProseLine(line) (the #10102 reading) or admit a leading ** / __ in the two regexes, with a control that the bare spelling still matches and a case for the decorated one; PR #18678's battery already pins 「the decorated spelling really is refused while the bare one matches」 as the CURRENT behaviour — that pin flips with the fix. ⚠️ It moves three landed rows' populations (H2 / H47 / H66), so it is its own card, not a rider.

⛔ Not measured

  • How many live threads carry a decorated Claim: / Release: today (one specimen is proven; a census over the queue population would size it).

Refs: #18372 · PR #18678 (H67 declares the loss) · #10102 (the decorated-directive fix for Blocked-by: / Restart-when:) · objectstack#16529 comment 5691473966

domain:skills execution seat · seat post #7623 · readings taken on origin/main 7f7b8557d


Generated by Claude Code

Activity

  1. os-justin commented on Sep 17, 2026

    @os-justin
    CollaboratorAuthor

    Claim: PM loop round 1
    Session: session_01Gqi43smmqjJ5sUrhfoPeKu
    Branch: claude/issue-18680-decorated-claim-release-markers
    Worktree: objectstack-issue-18680
    Domain: domain:skills
    Seat: domain:skills#1
    File surface: scripts/pm/check-half-states.mjs only (CLAIM_COMMENT_MARKER :1138 and RELEASE_COMMENT_MARKER :1169 anchor the bare word at line start, so a DECORATED **Release:** line — the live specimen #16529 comment 5691473966, a real return-to-queue record — reads as ABSENT to H2 / H47 / H66, and H67 (PR #18678) declares that loss rather than widening; deliverable = the two markers read through the #10102 reading (undecorateProseLine, the decorated-directive treatment Blocked-by: / Restart-when: already get), ⛔ not a bare \*\* bolt-on, WITH the triage's second half (5716952460): a line that LOOKS like a marker but does not match makes a sound — reported on the row or in the summary, never silent — so the next decoration does not replay this; the PR #18678 battery pin that says 「the decorated spelling really is refused」 flips with the fix, and the three rows' populations (H2 / H47 / H66) are re-read on the live board as report-only, ⛔ no state write; strengthening only); non-governed scripts/pm/** ⇒ draft, skip-changeset, the seat lands it by CCR after the in-seat contract-tier review
    Container & model: M(读取侧走 undecorate + 疑似行发声 + pin 翻转 + 报告型普查), mode:subagent, model: claude-opus-5 — node scripts/pm/dispatch-gates.mjs --tier --repo objectstack-ai/objectstack scripts/pm/check-half-states.mjs at 2026-09-17T17:35Z on the fast-forwarded tree (080688b56; origin/main 5762eaf7e): 「Model tier — no path-derived mandate: the surface hits none of the 3 declared glob(s)」; default tier taken; the seat's contract-tier review at delivery
    Clause-②: no
    Thread-read: 5716952460
    Serial constraints cleared: PR #18678 (#18372, H67) on this file LANDED f8eaf6704 at 2026-09-17T15:36:18Z; 27 open PRs' file lists read at 2026-09-17T17:35Z — none touches scripts/pm/check-half-states.mjs; os-verify-lock.sh --status at 2026-09-17T17:35Z: free; the objectui copy of this file is byte-pinned and re-synced only through objectui#9395, ⛔ not hand-mirrored. Hot-file note: #18664 (p3, ISSUE_BODY_LIMIT) queues behind this card on the same file. Slot: the one freed by #18673's delivery (PR #18735, under the seat's review); #18701 and #18601 in flight. Total order at 2026-09-17T17:35Z: p1 — #18709 (serial behind PR #18730, in the merge queue); p2 by age — #18536 (SKILL.md serial queue) · #18661 (behind PR #18735) · this card · #18683 (behind #18701) · #18693 (behind PR #18730) · #18699 (behind PR #18725) · #18702; p3 — #18664 (behind this card) · #18527 · #18622 · #18662 · #18665 · #18686 · #18705.
    Ruling-ref: 5716952460


    Generated by Claude Code

  2. os-justin commented on Sep 17, 2026

    @os-justin
    CollaboratorAuthor

    os-dev-report

    {
      "issue": 18680,
      "status": "done",
      "branch": "claude/issue-18680-decorated-claim-release-markers",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/18756",
      "head_sha": "702b42413467e86bc798872ea9641e14912168dc",
      "files": ["scripts/pm/check-half-states.mjs"],
      "session": "session_01Gqi43smmqjJ5sUrhfoPeKu",
      "premise_still_valid": true,
      "summary": "The two ownership markers now read through markerMatches — the bare test first (so the reading is strictly additive by construction), then the same undecorateProseLine the Blocked-by:/Restart-when: family has used since objectstack-ai/objectstack#10102. All nine in-file call sites go through that ONE place; both constants keep their bare semantics, so the cross-file importer check-clause2-carriers.mjs is untouched and every case that pins a constant stays green. Undecorating is refused through a markdown list item, because the shared stripper takes every asterisk and a `* Claim:` bullet would otherwise become a directive while H20's pinned `- Claim:` stays refused. The triage's second half is the OWNERSHIP_MARKER_NEAR_MISS_FORMS vocabulary (5 named, frozen, fixture-per-member, roster asserted equal to a frozen id list) plus an unconditional summary clause naming card, comment id and offending prefix. H67's declared loss is retired on its row and in its clause. ONE correction to the card's prose: the specimen's `**Release:**` is the 45th line of comment 5691473966, not its first — the markers are m-flagged, so position never hid it; the asterisks did. The defect itself reproduced exactly.",
      "tests": "self-test 4782 cases / 4 batteries -> 4881 cases / 5 batteries, pnpm check:pm-half-states exit 0. New battery 'H2/H47/H66 decorated ownership marker' 98 cases pinned at 94; SELF_TEST_BATTERY_FLOOR 4 -> 5. BEFORE-READINGS (specimen fetched via REST, never retyped): RELEASE_COMMENT_MARKER over comment 5691473966 body = false, over its release line = false, over the SAME line with the bold stripped (control) = true; undecorateProseLine measured to strip backticks and asterisks and nothing else (not underscores, not a heading hash). ABLATION: deleted the undecorated leg of markerMatches from the committed state, EXIT/INT/TERM trap, absolute paths; on-disk proof BEFORE reading any result (injected marker 1x, deleted text 'const undecorated = raw' 0x, HEAD blob 44aed794 vs mutated b4ab48a2 — not a no-op); result 17 red / 4864 green, every red a new-or-flipped case (the four objectstack-ai/objectstack#16529 cases, H2/H47/H66 on a decorated record, five decoration cases, two bullet-discriminator cases, the flipped H67 pin) and every bare-spelling control, near-miss vocabulary case and marker-constant pin green; restore verified by hash match AND empty `git diff HEAD`, not by an exit code. FLIPPED PIN: PR objectstack-ai/objectstack#18678's 'a DECORATED **Release:** line does not stand the row down' EDITED (not deleted) to 'loss CLOSED: now STANDS THE ROW DOWN', companion flipped from 'the row DECLARES that blind spot' to 'no longer DECLARES a blind spot it no longer has'; its two control cases untouched and green because they assert on the CONSTANT. LIVE BOARD, report-only, zero state writes: two full sweeps, BEFORE at 62bce5c29 17:53-18:01Z, AFTER on this branch 18:01-18:09Z — H2/H47/H66 verdict sets IDENTICAL (H2 on objectstack-ai/objectstack#13597 and objectstack-ai/objectstack#15638 in both; H47 and H66 listed nothing in either); the 8 differing rows (H14 objectstack-ai/objectstack#18617, H38 objectstack-ai/objectstack#7623, H52 objectstack-ai/objectstack#18617 out; H1 objectstack-ai/objectstack#18709, H19 objectstack-ai/objectstack#18734, H36 objectstack-ai/objectstack#18414/#18720/#18741 in) are all board churn in those 8 minutes and none reads an ownership marker; objectstack-ai/objectstack#16529 still lists on H67 in both because its newest merge is now PR objectstack-ai/objectstack#18678 (2026-09-17), NEWER than the 2026-09-16 release record, so 'nobody has looked since the delivery landed' is a correct reading — its row text did change, the declared loss is gone. DIRECT delta over 286 open pm:queue/pm:dispatched cards and 770 comments: 4 records NEWLY READ on 4 cards (#16529 5691473966 bold Release — the card's own specimen; objectstack-ai/objectstack#17852 5700605769 backticked Release; objectstack-ai/objectstack#15468 5549954050 bold Claim; objectstack-ai/objectui#10102 5486688759 backticked Claim), 0 REGRESSIONS. COUNTERFACTUAL on the same live threads, both readings: 3 of 6 cards change — objectstack-ai/objectstack#16529 H47 FIRES->clean and H66 none->pm:queue; objectstack-ai/objectstack#17852 H47 FIRES->clean and H66 none->the maintainer; objectstack-ai/objectstack#15468 H47 clean->FIRES; objectstack-ai/objectui#10102/#16233/#18143 unchanged. NEAR-MISS census live: 2 over that population (#16233 5704218834, objectstack-ai/objectstack#18143 5707808263, both '### Release:' form heading); over the sweep's wider 187-thread corpus the clause named 3 (#18336 5693290763 list-item; objectstack-ai/objectstack#15768 5556889538 heading; objectstack-ai/objectstack#6736 5235658231 separator). GATES: 38 derived with `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` from the worktree (no hand-fed paths; change set = the one file), every one run, exit captured by redirect-then-$? before any pipe, reconciled with --ran. 37 exit 0. check:nul-bytes exited 1 on the FIRST pass and was right to — an editing tool had materialised a backslash-u-0001 escape into a real 0x01 byte in the near-miss dedupe key — fixed by writing the escape text (byte-identical at runtime), re-run 0, and the rule's own grep -naP control-byte self-scan over the file returns nothing. NOT MEASURED: pnpm check:pm-dispatch-gates — its self-test exceeds this container's ~10min foreground ceiling; the timed attempt was SIGTERMed at 560s with 1768 green and exit 124 (no verdict, not a red), the detached re-run stood at 1624 green / 0 red and still running when this report was written; reason is runtime under today's container contention, and the PR touches neither dispatch-gates.mjs nor its fixtures, so CI owns the verdict. Repo-wide `pnpm lint` (eslint . --no-inline-config): exit 0.",
      "mcp_calls": "0 — no MCP GitHub tool was called; every GitHub read and write went through the REST proxy with curl",
      "api_writes": "3 — POST /repos/objectstack-ai/objectstack/pulls (draft PR objectstack-ai/objectstack#18756); POST /repos/objectstack-ai/objectstack/issues/18756/labels (skip-changeset, read back: the PR carries exactly ['skip-changeset']); POST /repos/objectstack-ai/objectstack/issues/18680/comments (this os-dev-report). Plus the git pushes on the branch. Zero writes outside that budget; zero state writes to any card from either sweep.",
      "open_questions": [],
      "out_of_scope_findings": [
        "noted, not filed: H66's summary clause still carries the dated reading 'Measured 2026-09-16 over 29 threads on two boards, the canonical Release: line appeared ZERO times'. It names its date and its boards so it stays true as written, but it was taken with the BARE reader and this PR changes what a re-measure would find. Not a defect class (a) — nothing is wrong, the sentence is a dated measurement rather than a live claim. Who would meet it: the next author of H66's buy-order or clause. In the PR's Acceptance notes.",
        "noted, not filed: scripts/pm/check-clause2-carriers.mjs imports CLAIM_COMMENT_MARKER and tests it against a raw comment body, so it still cannot see a decorated claim. Correct for this card's declared file surface (the constant is deliberately unchanged), and a reading about THAT file rather than a defect in this one. Who would meet it: whoever next touches that gate's claim leg. In the PR's Acceptance notes.",
        "noted, not filed: objectstack-ai/objectstack#18664 (ISSUE_BODY_LIMIT, queued behind this card on this file) was read and not touched, as dispatched. The new summary clause adds ~997 chars to a ~19.3k-char summary line and the markdown renderer's existing budget/cap pins (MARKDOWN_BODY_BUDGET and ISSUE_BODY_LIMIT = 65536) all stayed green, so this PR does not move that card's premise either way."
      ]
    }

    Generated by Claude Code

  3. os-justin commented on Sep 17, 2026

    @os-justin
    CollaboratorAuthor

    ACCEPT — in-seat contract-tier review of PR #18756 (head 702b42413, report 5719730869) by the skills seat, 2026-09-17T19:22Z. Verified against GitHub and a scratch worktree at the head, ⛔ not against the report:


    Generated by Claude Code

  4. os-justin commented on Sep 17, 2026

    @os-justin
    CollaboratorAuthor

    LANDED — PR #18756 (#18680, the two ownership markers read through markerMatches, and a near miss made audible) merged through the queue at 2026-09-17T19:45:33Z (merged_at), squash 95e174527 (single parent e2050cefc, an ancestor of origin/main; markerMatches, OWNERSHIP_MARKER_NEAR_MISS_FORMS and the 5-battery roster read in check-half-states.mjs on main, its --self-test on main answers 4881 cases); armed by this seat through the CCR route after the in-seat ACCEPT 5719949828 — ready 2026-09-17T19:22:10Z, added_to_merge_queue 2026-09-17T19:22:12Z. The card auto-closed completed at 2026-09-17T19:45:35Z on the PR's Fixes; pm:dispatched is stripped in the same act. Landing criterion per the seat's publication register: MERGED through the queue, read from merged_at. Carried out, not buried: the importer's own blind spot is #18764 (filed this round, behind #18719 on check-clause2-carriers.mjs). Follow-up on this file, now free of this serial: #18664 (p3).


    Generated by Claude Code

  5. added 2 commits that reference this issue on Sep 28, 2026
    95e1745
    42f8df1
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions