Skip to content

fix(pm): GitHub REST channel reachability is a session property — not an endpoint or seat-type fact - #13367

Merged
os-zhuang merged 2 commits into
mainfrom
claude/issue-12654-label-channel-session-facts
Aug 30, 2026
Merged

fix(pm): GitHub REST channel reachability is a session property — not an endpoint or seat-type fact#13367
os-zhuang merged 2 commits into
mainfrom
claude/issue-12654-label-channel-session-facts

Conversation

@zhuangjianguo

Copy link
Copy Markdown
Collaborator

Fixes #12654
Fixes #12766

Family fold — one PR for both cards, per the 2026-08-28 triage rulings on each (「两张卡一个 PR」), with one commit per member.

What changed

.claude/agents/os-dev.md (member card 12654, commit d7b408c) — the labels bullet's parenthetical stated a seat-type fact: container dev seats get 403 on repo-scoped REST as a class (a 2026-08-25 reading). That is contradicted by four independent gate-open dev-container readings of HTTP 200 on the additive label POST. Rewritten, line-neutral, to the per-session form: reachability is a property of the session, not of the endpoint or the seat type — the session gate answers before the endpoint is consulted, reads and writes fail together behind a closed gate, gate-open sessions measure 200 — probe first; the readings live in platform-readings. Also added the adjudicated limitation beside the four-step fallback: the compare read-back only DETECTS a concurrent label strip, it cannot PREVENT one, and a stripped gate-semantic label reads as green.

.claude/skills/pm-dispatch/references/platform-readings.md (member card 12766, commit 8d9a85f) — the fact line said "session property" but still carried endpoint-shaped residue (a single gate-open counterexample; per-container framing). Rewritten to the adjudicated shape with the three measured facts: (1) the 403 body "GitHub access is not enabled for this session" is a session gate answering before the endpoint is consulted, so a closed-gate 403 has zero discriminating power about any specific endpoint; (2) behind a closed gate, reads AND writes both 403 (matched-pair control); (3) four independent gate-open dev containers measured the additive label POST at 200, each confirmed by an independent GET read-back, and the channel is wider than labels — issue POST 201, comment writes, card/comment reads. The probe stays the only safe reading; no channel is written as an unconditional guarantee.

This dev's own session adds a fresh corroborating reading: a 14-character env token with a gate-open session — repo-scoped GET 200, additive label POST 200 with read-back (below) — so token length does not decide the channel; the session gate does.

Kept intact (adjudicated)

  • The four-step fallback (read, union, whole-set write, compare read-back) and its rationale, including the size-labeler counter-strip evidence — 「⭐ 卡把 fallback 写得很好,⛔ 一个字都不要删」: semantics fully preserved; wording compressed only where needed to pay the line ratchet.
  • The two read-channel cards are not cited for any write claim; their own subjects are untouched.

Line budget (both files sit at their ratchet ceilings with zero headroom)

  • os-dev.md: 466 lines before, 466 after (ceiling 466); the edited bullet stays 13 lines.
  • platform-readings.md: 314 lines before, 314 after (ceiling 314); the edited entry stays 10 lines.
  • Every edited line within the 120-byte cap (gate-verified).

Gates — post-final-commit union at head 8d9a85f, via scripts/pm/os-verify-lock.sh, VERDICT command-exit 0

check:agent-model-declared · check:agent-test-spelling · check:doc-authoring · lint check:doc-formula-expressions (after building the @objectstack/lint closure — its first run was "PREREQUISITE NOT MET", a non-measurement, not a red) · check:nul-bytes · check:pm-governed-merges · check:pm-skill-id-lint · check:pm-skill-ratchet (its own verdict lines: "os-dev.md is 466 lines (ceiling 466; headroom 0)" and "platform-readings.md is 314 lines (ceiling 314; headroom 0)") · check:skill-frame-sync — all exit 0, joined with the shell AND operator so the lock's verdict covers every one. check-governed-queue-guard: its 113-case self-test passes locally; the guard itself reads a CI event payload and judges at queue time by design.

Gate list re-derived from the actual diff with scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack: matches the dispatch's 10 families exactly. Changeset families intentionally not triggered — the diff is entirely under .claude/**, so skip-changeset applies (label on this PR, with compare read-back).

Governed surface

Both files are under .claude/** — this PR stays DRAFT for the maintainer's hand merge; no seat flips it ready, queues it, or arms auto-merge. Please update the base to current main and re-run gates before merging.

Reported to the PM, outside this PR's file surface

The standing-text sweep (item two of the head card's "Not established" list) found one residue: references/rest-channel.md frames its checkmark annotations per seat category in its header, while its own definition line already reads each checkmark as "measured in a gate-open session" — consistent with the session-property shape, so nothing here contradicts it; flagged for a follow-up wording alignment if the PM wants one.

Generated by Claude Code


Generated by Claude Code

claude added 2 commits August 30, 2026 06:58
…n the os-dev labels bullet

The labels bullet's parenthetical asserted a seat-type fact (container dev
seats get 403 on repo-scoped REST as a class), contradicted by four
independent gate-open dev-container readings of HTTP 200 on the additive
label POST. Rewritten to the per-session form: the session gate answers
before the endpoint is consulted, reads and writes fail together behind a
closed gate, and gate-open sessions measure 200 — probe first, never
assume either direction. Also adds the adjudicated read-back limitation:
the compare read-back only detects a concurrent strip, it cannot prevent
one, and a stripped gate-semantic label reads as green. Line-neutral under
the ratchet (466/466, all lines within 120 bytes).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EXxTW8mvPBhoHxmyPZ63de
…rying the gate-open readings

The fact line said 'session property' but still carried endpoint-shaped
residue: a single gate-open counterexample and a per-container framing.
Rewritten to the adjudicated shape — reachability is a property of the
session (the GitHub App session gate, snapshotted at session start), not
of any endpoint or seat type: the gate answers before the endpoint is
consulted, so a closed-gate 403 has zero discriminating power about any
specific endpoint; reads and writes fail together behind it; and four
independent gate-open dev containers measured the additive label POST at
200 (each confirmed by an independent GET read-back), with the channel
wider than labels — issue POST 201, comment writes, card/comment reads.
Probe method kept as the only safe reading; no channel is stated as an
unconditional guarantee. Line-neutral under the ratchet (314/314, all
lines within 120 bytes).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EXxTW8mvPBhoHxmyPZ63de
@claude claude Bot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Aug 30, 2026
@github-actions github-actions Bot added the documentation Improvements or additions to documentation label Aug 30, 2026
@os-zhuang
os-zhuang marked this pull request as ready for review August 30, 2026 07:22
@os-zhuang
os-zhuang added this pull request to the merge queue Aug 30, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Aug 30, 2026

Copy link
Copy Markdown
Collaborator Author

Dequeue root cause (skills lane seat): the queue ejection at 07:54Z was the Governed Surface Queue Guard working as ruled, not a test failure — merge-group run 33299410038 is the red check (failure, branch gh-readonly-queue/main/pr-13367-…), while the same window's run for PR #13364 passed because that PR carried an APPROVED review pinned to its head. This PR's diff is governed (.claude/**) and it currently has zero reviews: it was enqueued directly at 07:22Z without an approval, so the guard's merge_group leg refused it, deterministically — re-queuing without the approval will red again every time.

What unblocks it (one click, either authorized account): an Approve review on this PR — it pins to the current head 8d9a85f45 (no pushes since; review requests to both accounts have been standing since 07:13Z). Once the pinned approval exists, this seat re-queues it. The alternative terminal path stays open as always: hand-merge the draft-reviewed content directly.

This seat cannot supply the approval (agent seats never approve governed PRs) and will not re-queue until the predicate is satisfiable.


Generated by Claude Code

@os-zhuang
os-zhuang added this pull request to the merge queue Aug 30, 2026
Merged via the queue into main with commit 94efa2a Aug 30, 2026
29 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-12654-label-channel-session-facts branch August 30, 2026 11:07
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/s skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

3 participants