Skip to content

ci(fleet-write): the advisory mint comment names its four write rows and the read mint - #29620

Merged
os-zhuang merged 1 commit into
mainfrom
claude/project-thread-7gpiq3-b
Nov 2, 2026
Merged

os-zhuang merged 1 commit into
mainfrom
claude/project-thread-7gpiq3-b

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Requested by Irene · project thread

Fixes #29448

What changes

Item 3 of the card, alone, because it sits on a Tier H file. Items 1 and 2 are in the companion Tier S PR, which carries Part of #29448.

.github/workflows/fleet-write.yml, the comment above permission-repository-advisories in the mint step: it said THREE consumers (advisory_report, advisory_collaborators_add, advisory_state). It now names the four rows that write (adding advisory_create), and says that advisory_read gets a separate READ-ONLY mint through the same input: the validator writes permission_repository_advisories=read for its stroke, never write.

Comment lines only. No step, input, with: value, permission or code path changes; git diff -w shows no changed line that is not a # comment, and the file still parses as YAML.

Why

The comment documented the mint as main had it before advisory_create and advisory_read landed; the op table (scripts/pm/fleet-write/ops.mjs, "The four rows that touch a security advisory" and "The one row that READS an advisory") and the validator's self-test (the read's stroke mints repository-advisories: read, a writing row's mints write) are what the workflow does today.

Verification

  • node scripts/pm/dispatch-gates.mjs --commands derived 37 commands for this diff; all 37 exit 0 on this head, including check:pm-fleet-write-dispatch, check:required-contexts, check:workflow-step-name-quoting, check:workflow-status-functions, check:pm-expected-skips, check:step-collectors and check-comment-mask-corpus.
  • node scripts/check-commit-card-trailers.mjs --range origin/main..HEAD exit 0.

Clause-②: no
Metadata-protocol: none

Keep one value on each of the two lines above, each line starting with its key.
Human Minimum
item 5 says what they mean.

Human Minimum

  • 1. Schemas start as Zod; packages/spec holds no runtime logic. (not touched)
  • 2. Every name I added uses the casing for its kind. (no names added)
  • 3. No formatter ran; pnpm lint passes. (no formatter ran; pnpm lint itself was not run locally, the diff touches no linted package source)
  • 4. One issue, one branch off an up-to-date main, one pull request. (the card is split in two PRs by the seat's order, both off main, neither stacked)
  • 5. A change that publishes carries a changeset, and both declaration lines are filled in here and in the changeset. (publishes nothing: skip-changeset)
  • 6. packages/spec touched: its generated artifacts are regenerated and committed. (not touched)
  • 7. No hand edits to content/docs/references/, packages/*/CHANGELOG.md or content/docs/releases/.
  • 8. Title, body and comments are in English.
  • The Before Submitting list in CONTRIBUTING.md is done.

🤖 Generated with Claude Code

https://claude.ai/code/session_01J8VVAjYkaBE16yPTYraBmt

…and the read mint

The comment on `permission-repository-advisories` said THREE consumers. The op
table has four rows that write (`advisory_report`, `advisory_create`,
`advisory_collaborators_add`, `advisory_state`), and `advisory_read` gets a
read-only mint through the same input. Comment only: no step, input,
permission or code path changes.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01J8VVAjYkaBE16yPTYraBmt
@objectstack-fleet objectstack-fleet Bot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Nov 2, 2026
@github-actions github-actions Bot added the size/s label Nov 2, 2026
@huangyiirene huangyiirene self-assigned this Nov 2, 2026
@huangyiirene
huangyiirene self-requested a review November 2, 2026 22:03
@github-actions github-actions Bot added the ci/cd label Nov 2, 2026
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#1 · huangyiirene · session_01J8VVAnMUWA9rufXzFaEh4J

Contract-review-claim: session_01J8VVAnMUWA9rufXzFaEh4J · head 237b49d · 2026-11-02T22:04Z

The seat review runs at CONTRACT_REVIEW_TIER in an isolated subagent (the seat session is not at that tier).

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#1 · huangyiirene · session_01J8VVAnMUWA9rufXzFaEh4J

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 237b49d972815876a3f371fd300198c8dc3f16ba
Local-runs: probe — on a detached worktree of the head (merge-base with origin/main dd4a21f, the same commit PR #29619 sits on; origin/main at 454ee1a when fetched; fleet-write.yml, ops.mjs, validate.mjs and execute.mjs did not move on main since the merge-base): git diff -w dd4a21f8 237b49d9 (13 changed lines, every one a # comment line; zero changed lines that do not start with #); python3 -I YAML parse of fleet-write.yml on the head and at the merge-base (1 job, 5 steps both, and the two parsed trees compare equal, so the comment-only claim is proved at the parser, not only by eye); node scripts/pm/check-governed-merges.mjs --branch HEAD and --pr 29620 (exit 3, GOVERNED, Tier H, one hit .github/workflows/**, 13 changed lines); node scripts/pm/fleet-write/validate.mjs --self-test (303 cases, exit 0; its workflow battery reads the head's fleet-write.yml text), dispatch.mjs --self-test (315 cases, exit 0), execute.mjs --self-test (259 cases, exit 0); node scripts/pm/check-skill-line-ratchet.mjs (exit 0) and node scripts/pm/check-skill-id-lint.mjs (108 files clean, exit 0) as the no-drift control on the untouched skill tree; node scripts/check-commit-card-trailers.mjs --range dd4a21f8..HEAD (exit 0, no model identifier); node scripts/pm/dispatch-gates.mjs --commands (its own count line: 37 commands, matching the PR body's 37; the sweep itself NOT MEASURED here, read from CI); git grep of the stale phrase over the head tree and over origin/main. The worktree was removed after the runs and the main checkout was not touched.
Scope: .github/workflows/fleet-write.yml (the governed hit: the comment above permission-repository-advisories in the mint step, 5 lines replaced by 8) + read, not reviewed: scripts/pm/fleet-write/ops.mjs (the five advisory rows and their permission/grant fields, PERMISSIONS, STROKE_SCOPED_PERMISSIONS, the two advisory section headings), scripts/pm/fleet-write/validate.mjs (levelOf, tokenPermissionsOf, the permission_<name> output line, the self-test cases pinning write for the four writing rows, read for advisory_read, empty for every other stroke, and the one that reads the workflow's mint inputs), the rest of fleet-write.yml's mint step and its header, card #29448 body, comments 6581779817 (triage) and 6587178205 (claim), PR #29620 body and its one comment 6589627039 (the seat's review claim on this head)

Reviewer: an isolated contract reviewer at CONTRACT_REVIEW_TIER, read-only on GitHub (REST reads only; nothing written, pushed, labelled or commented), fed the card body and comments, the PR body, the diff against the merge-base, the head's check-runs, contract-review.md and review-checklist.md. The PR body's verification section was read as input, not as conclusions; every count below is this review's own measurement. No environment variable value is printed anywhere in this record, and no advisory, finding or mechanism is named: the diff is one code comment about the relay's advisory rows.

① Derived judgments

  1. File surface. One commit (237b49d, author Claude, PR author objectstack-fleet[bot], head repo = base repo, draft, base main, trailers Claude-Session: + Co-Authored-By: Claude, no model identifier). git diff --numstat dd4a21f8 237b49d9, the REST file listing and the PR body agree on exactly one path: .github/workflows/fleet-write.yml +8/−5 (blob 8e31d25d → 6c5e2a7f). The claim's file surface for PR B (6587178205) was this one file, the mint-step comment only, with stop-on-breach; nothing else is touched. Correct, and on surface.
  2. Comment-only, proved twice. git diff -w shows 13 changed lines and every one begins with #; a filter for changed lines not starting with # returns nothing. The YAML parse of the head and of the merge-base gives 1 job and 5 steps each, and the two parsed documents compare equal: no step, id, uses, with: value, env:, permissions: or trigger changed. The mint input permission-repository-advisories: ${{ steps.validate.outputs.permission_repository_advisories }} is byte-identical and the validator's own battery that counts exactly one such input against the workflow text still passes on the head. Correct.
  3. "FOUR write consumers" is the op table. ops.mjs has exactly four rows with permission: 'repository-advisories' and no grant (advisory_report, advisory_create, advisory_collaborators_add, advisory_state), each alone: true; PERMISSIONS['repository-advisories'] is 'write', so levelOf yields write for each, and the validator's battery pins permission_repository_advisories=write for a stroke of any of the four. The comment's parenthetical descriptions match the rows: one private report (one POST to the reports endpoint), one draft advisory (one POST to the collection), and one advisory's PATCH for the two id-carrying rows. The merge-base comment named three and omitted advisory_create; origin/main still says THREE at line 154 and nothing else in the tree says so about these rows. Correct.
  4. "Separately, advisory_read … a READ-ONLY mint through this same input … =read, never write" is the code. OPS.advisory_read has permission: 'repository-advisories', grant: 'read', alone: true, one GET; levelOf returns the row's grant, tokenPermissionsOf therefore carries repository-advisories: read for its stroke, and the validator's battery pins the output line permission_repository_advisories=read for a read stroke while a writing row's stroke still mints write, and a grant-ledger case pins that advisory_read is the only row naming a grant, at read, on a stroke-scoped permission. "also alone" and "through this same input" are both the table and the one mint input. Correct.
  5. The unchanged sentences still hold around the new ones. "Minted ONLY for a stroke carrying one of them, which travels alone, the same way as permission-actions" is STROKE_SCOPED_PERMISSIONS = ['actions', 'repository-advisories'] plus every advisory row's alone: true; "an EMPTY value for every other stroke" is the battery that writes permission_repository_advisories= and no grant for every non-advisory op, including the actions strokes. The measured-run sentence, the expected-warning paragraph and the refused-mint sentence are carried over with their words intact (one line re-wrapped). Correct.
  6. Governance. check-governed-merges.mjs --branch HEAD and --pr 29620: 1 path, 1 register hit (.github/workflows/**), Tier H, 13 changed lines under the 3000 threshold, exit 3 as designed. The PR is a draft with no reviews, auto_merge null; Governed Surface Queue Guard is success on the head. This record is the at-tier review of record; it does not lift the landing, which waits for a GOVERNED_APPROVERS review or the maintainer's hand. Correct.
  7. PR body against the head. First content line Fixes #29448; the body's only issue number is 29448, named twice (the keyword line, and the quoted Part of #29448 it attributes to the companion PR); no closing keyword sits beside any other card, and the PR-body guards check is success. Clause-②: no and Metadata-protocol: none are right (no published package, no spec, no changeset; skip-changeset and Check Changeset success). The body's "comment lines only", "git diff -w shows no changed line that is not a # comment", "still parses as YAML" and 37 derived commands all reproduce here. Human Minimum item 3 is left unchecked with a reason; Lint · ESLint and Lint · CI, release & engine gates are success on the head, so the gates it stands for are read from CI. Correct.
  8. Fixes is the right keyword only in the order the claim planned. The card has three items; this PR carries item 3, PR docs(pm-dispatch): advisory_report needs the same advisory write grant as advisory_create #29619 items 1 and 2, and the claim (6587178205) places Fixes on the last to merge. Merged after docs(pm-dispatch): advisory_report needs the same advisory write grant as advisory_create #29619 this PR closes a card with nothing open; merged before it, it would close the card with two items still in flight. The landing is in the seat's hand on both PRs (Tier S queue for docs(pm-dispatch): advisory_report needs the same advisory write grant as advisory_create #29619; Tier H approval then the seat's landing for this one), so the order is the seat's to keep. Recorded as a landing condition in ③, not a defect in the diff.
  9. Nothing new on any surface: no step, input, permission, grant, gate, label, register row or package; the token the run writes with is minted exactly as before. The card asked for the mint-step comment to say four; this PR says four and adds the read-level mint that feat(pm): advisory_read relays an advisory's text sealed to a one-time key the seat alone holds #29536 brought in after the card was filed, which the claim's premise line names as owed.

② Semver level

None. No published package, no packages/spec/src/**, no TypeScript; a comment in a CI workflow. skip-changeset is the right declaration and Check Changeset is success on the head.

③ Boundary flags

  • Dev open_questions: none in the PR body. No flag.
  • Assignee and requested reviewer huangyiirene on the PR: the PR's assignee mirrors the card's by pr_create, per AGENTS.md; no second claim, no approval, no review submitted. No flag.
  • Landing order (①.8): this PR's Fixes #29448 closes the card on merge, so it merges after docs(pm-dispatch): advisory_report needs the same advisory write grant as advisory_create #29619, or the seat swaps the keyword for Part of and closes the card by hand. The claim planned the order; the seat holds it.
  • Both branches off main at dd4a21f, not stacked: PR docs(pm-dispatch): advisory_report needs the same advisory write grant as advisory_create #29619's merge-base is the same commit and its two paths are disjoint from this one. Confirmed.
  • Independence: PR author objectstack-fleet[bot], commit author Claude; no off-relay author note is owed. The PR thread carries the seat's Contract-review-claim: for this head (6589627039) and no other record.
  • Tier H: this record does not lift the landing; the maintainer's hand or an authorized approval does, and then the owning seat lands it.

④ Design judgment

Per hits file, against the card's scenario (the next reader of the mint step's advisory input should find a comment that counts the rows the table has and says what level each stroke mints):

  • .github/workflows/fleet-write.yml: rewriting the one comment block in place, and nowhere else, is the right cut for a Tier H file whose card item is a comment. Naming the four writing rows by their row names (the same names ops.mjs and validate.mjs use) and then the read row with its level keeps the comment a mirror of STROKE_SCOPED_PERMISSIONS and levelOf rather than a second source of truth, and the validator's workflow battery still pins the single mint input the comment describes. The header comment higher in the file (the paragraph on the token the run writes with) still describes the advisory stroke's grant at write only and does not mention the read level; that paragraph is outside the card's item 3 and outside the claim's stop-on-breach surface, is not wrong for the four writing rows, and belongs to a follow-up card rather than to this diff. Holds.

Must-fix: none.

Should-fix: none on the diff; one landing condition (③): merge after #29619, or re-word Fixes to Part of and close the card by hand, so the card does not close with items 1 and 2 open.

Check-runs at record time (2026-11-02T22:23Z): 60 check-runs on 237b49d, 44 success, 16 skipped, 0 failure, 0 in progress; combined status pending (statuses API, 0 statuses). Success: Lint & Repo Gates, Lint · repo & tooling gates, Lint · CI, release & engine gates, Lint · PM dispatch-gates, Lint · docs & code guards, Lint · ESLint, Lint · scoped · tooling self-tests, Lint · scoped · slot lookup & corpus, Lint · scoped · query-options erasure, TypeScript Type Check, Type Check · workspace / source gates / debt ledger / consumer gates, Governed Surface Queue Guard, PR-body guards, Check Changeset, Check PR Size, Dogfood Regression Gate, Build UI Deps, Build & E2E UI, Live E2E UI, Lint UI, Type Check UI, Test Core, Test UI and all 16 Test UI shards, Auto Label, filter. Skipped by path filter or opt-in: Build Core, Build Docs, Plan Test Core shards, Test Core shards, Dogfood Verify CLI, UI Published Artifacts, Temporal Conformance, Schedule gate, 18.x upgrade harness, Packed-tarball smoke. mergeable_state blocked, draft, auto_merge null, labels ci/cd, size/s, skip-changeset; Tier H (.github/workflows/**), landing by the maintainer's hand or an authorized approval, not by this record.

Implemented-by: claude/project-thread-7gpiq3-b
Reviewed-by: session_01J8VVAnMUWA9rufXzFaEh4J

VERDICT: PASS


Generated by Claude Code

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#1 · huangyiirene · session_01J8VVAnMUWA9rufXzFaEh4J

维护者速读

  • 改了什么: fleet-write.yml 铸令牌一步的注释:原文说该授权有「THREE consumers」,实际是四个写公告的行(铸 write),另有 feat(pm): advisory_read relays an advisory's text sealed to a one-time key the seat alone holds #29536 新增的只读 advisory_read(同一输入,校验器写 permission_repository_advisories=read)。只改注释,+8/−5。
  • 为什么改: 注释与工作流实际行为不符,下一位读中继公告行的人会被误导。
  • 风险与回滚: git diff -w 只有 # 注释行变化;YAML 解析树与 main 相同。可整 PR revert。
  • 先看: .github/workflows/fleet-write.yml 第 154 行附近。
  • 两分钟验证: git diff -w origin/main... 只见注释行。
  • 需要你做的: .github/workflows/** 是受治理 Tier H 面,需 os-zhuang 或 hotlong 批准。达档复核 PASS 见评论 6590009881,Head-sha 237b49d972815876a3f371fd300198c8dc3f16ba。批准后本席落地。
  • 席位意见: ACCEPT。

席位核对 — ACCEPT · domain:skills#1 · head 237b49d972815876a3f371fd300198c8dc3f16ba

  1. 形态: draft → main,Fixes #29448;skip-changeset;作者 objectstack-fleet[bot];一个文件,与认领一致。
  2. 前提实测: 复核方对照 ops.mjs / validate.mjs:四个写行 write,advisory_read 为 grant: 'read',校验器自测同时读工作流文本并在本 head 通过。
  3. 门禁 check-runs(钉 head 237b49d9): 60 条全部完成,success 44 / skipped 16 / failure 0。check-governed-merges:Tier H(.github/workflows/**)。
  4. 接受的偏差: 无。
  5. 范围外去向: 工作流头部一段对读级别的表述仍粗略,不在本卡三项内,记为后续卡素材。Skills-docs: none。
  6. 落地条款: Tier H。保持 draft,挂 needs-user-decision,请 os-zhuang、hotlong 审批;须在 docs(pm-dispatch): advisory_report needs the same advisory write grant as advisory_create #29619 之后合入(本 PR 关卡)。获批后本席过落地前检、清标、ready、auto-merge;维护者直合亦可。

Generated by Claude Code

@os-zhuang
os-zhuang marked this pull request as ready for review November 2, 2026 23:06
@os-zhuang
os-zhuang enabled auto-merge November 2, 2026 23:06
@os-zhuang
os-zhuang added this pull request to the merge queue Nov 2, 2026
Merged via the queue into main with commit d280265 Nov 2, 2026
66 checks passed
@os-zhuang
os-zhuang deleted the claude/project-thread-7gpiq3-b branch November 2, 2026 23:27
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ci/cd size/s skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

3 participants