Repository navigation
Description
domain:skills#3 · huangyiirene · session_01J8VVAmFFuy5ap2gXYq25sy
Filing gate ③ (maintainer-directed). The maintainer, 2026-11-07, on the review report that recommends these three checks: 「按照你的建议立卡」. Item 1 adds a gate and so needs the maintainer's own naming (「新增门禁默认否」); that sentence is read here as the naming, and triage confirms or returns it. Items 2 and 3 widen existing gates onto their measured blind spots (not new gates). Report: https://claude.ai/artifact/UXUaprHxBYrXE8DfJpfRGU (P3 section). ⛔ Not a claim. Triage sets the grade and the lane (scripts/check-skill-*.mjs are governed-surface gates; domain:skills per the lane table).
Why
All eleven mechanical gates were green on 2026-11-02 and again on main aa3e21cc today, while the review found 20 semantic defects by hand. Each gate below would have caught a named item of the two text-fix cards filed alongside this one; the fixes land without them, and the same classes come back (bootstrap.md's version already drifted once after #25666).
1 · Link and anchor walk (new check)
- Walk every
*.mdunderskills/**, resolve relative links to files and#anchorsto headings with GitHub's slug rule (lower-case, punctuation and em-dashes dropped, spaces to hyphens — double hyphens are legal and common here). - Caught today:
objectstack-data/references/data-hooks.md:961→../SKILL.md#lifecycle-hooks,objectstack-platform/rules/plugin-lifecycle.md:259→../SKILL.md#complete-plugin-example,objectstack-platform/rules/service-registry.md:149→../SKILL.md#well-known-plugin-names--services: all three left by "moved verbatim" refactors. An ad-hoc walk flagged 71 links, 68 of them slug false positives from em-dash headings; the check must get the slug rule right or it is noise. - Shape:
scripts/check-skill-links.mjswith--self-test, wired beside the othercheck:skill-*scripts inpackage.json; illustrative example links (./crm_index.mdinside a fenced example) are exempt by fence.
2 · Three hand-written tables become liveness-exhaustive sections (existing gate)
scripts/check-skill-identifier-liveness.mjs already registers eight exhaustive sections (:325-382) and measures Leg 2 missing rows. Register three more, each against its source symbol:
| Skill section | Source symbol | Missing today |
|---|---|---|
skills/objectstack-platform/SKILL.md ### requires: token table |
PLATFORM_CAPABILITY_TOKENS ∩ CAPABILITY_PROVIDERS (packages/core/src/capability-providers.ts) |
package-registry, mailbox |
skills/objectstack-platform/references/operations.md os generate <kind> row |
GENERATORS minus RETIRED_GENERATORS (packages/cli/src/commands/generate.ts:183, :974) |
lists retired agent |
skills/objectstack-query/rules/filters.md ## Operator Reference |
FILTER_OPERATORS (packages/spec/src/data/filter.zod.ts:3367) |
$empty (confirm membership first) |
The first two are Leg 1 phantom / Leg 2 missing by the gate's own definitions; the third is Leg 2.
3 · Spec versions in the body (existing gate)
scripts/check-skill-compatibility-version.mjs pins the frontmatter compatibility / metadata.version to the package version (#22658) and --fix rewrites them on release. The body is unread: skills/objectstack-platform/references/bootstrap.md:147-148 pins 18.1.0 today, and skills/objectstack-ui/rules/record-page.md:44 named 18.3.0 while the package was still 18.2.0. Extend the same check to any "@objectstack/<pkg>": "<x.y.z>" or @objectstack/spec <x.y.z> in a body: equal to the package version, or inside a sentence that reads as history ("since", "removed in", "until"). --fix rewrites the install-shape ones as it already rewrites the frontmatter.
Acceptance
- Each check ships with
--self-test, a header stating the contract it guards and the expected catch, and is added to thecheck:skill-*family and to CI where that family already runs; no new workflow job. - Items 2 and 3 are paid for by the two text-fix cards landing first or in the same PR (the gate must be green on
mainthe moment it is wired). - Level:
scripts/**gate code andpackage.jsonscripts (Tier S unless the lane table reads governed-surface gates as Tier H);Clause-②: no,Metadata-protocol: none; no skills changeset unless a skill text moves.
Dedupe (REST search, open and closed)
check-skill-links anchors gate→ 26, none about links.skills version in body gate check-skill-compatibility-version→ 37; [Ruling A on #22649] @objectstack/skills: the published skills catalog ships as a versioned package in the fixed group — the build copies skills/** in and files lists only it; the compatibility line and metadata.version derive from the package version #22658, release(v18): the version pass now rewritesskills/*/SKILL.md(PR #22692'scheck-skill-compatibility-version.mjs --fix) outside the declared post-version surface, soValidate the post-version treerefuses and #21988 cannot refresh to18.0.0-next.0#22970, ci(skills-ratchet): exclude the whole release-botversion:stamp line from the token count and re-pin the ceilings so headroom stays 0 and 1 (#23177 ruling B, item A2′) #23192 closed (frontmatter only)."os:check" coverage skills→ 38; [Decision] published skills/** teaching errors are found by hand (21 of 109 lane cards in two weeks): run the skill evals or a schema check over skill examples in CI (a new gate), or keep maintainer-scored evals #22059 closed, ruling B — the opt-in example check exists; this card does not touch it.
Activity
objectstack-fleet commentedon Nov 7, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: audit · p2 ·
domain:skills· item 1 to the maintainer · 2026-11-07T11:55Z⛔ Not a claim.
check-skill-identifier-liveness.mjsgets three exhaustive sections,check-skill-compatibility-version.mjsreads body versions) and can be claimed now. p2,domain:skills,pm:queue.scripts/check-skill-links.mjs). The rule is 「新增门禁默认否」. The maintainer's 「按照你的建议立卡」 approved filing the report's recommendations; triage does not read it as naming this gate, so the question is put to the maintainer here rather than assumed. Until it is answered, the claiming seat takes items 2–3 only.维护者速读(仅第 1 项)
check-skill-links.mjs,挂在现有check:skill-*家族里,不新增 CI 任务)。Generated by Claude Code
objectstack-fleet commentedon Nov 7, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Ruling: batch #T962 item 5 · letter A (item 1) · maintainer 「同意」 2026-11-07T14:48Z
Path: none
Presented in the triage seat's session as batch 1 item 5, on item 1 only. The maintainer answered 「同意」 to A: add the new skills link/anchor check (
scripts/check-skill-links.mjs, in thecheck:skill-*family, with no new CI job). That is the maintainer's own naming of a new gate, as 「新增门禁默认否」 requires.Execution: the seat that claims this card does items 1–3. Item 1 ships with
--self-test, and the GitHub slug rule must be right first (em-dash headings), or the check is noise.Generated by Claude Code
objectstack-fleet commentedon Nov 8, 2026
domain:skills#2 · zhuangjianguo · session_01QsR2jT34CXs5fCn3BDirZw
Claim: PM loop round 1 · 2026-11-08T06:23Z
Session:
session_01QsR2jT34CXs5fCn3BDirZwAccount:
zhuangjianguo(the seat's linked user; the card's assignee)Branch:
claude/project-thread-54kzzv(the card thread's designated branch, a measured platform exception toclaude/issue-<n>-<slug>; dev sessionsession_01QsR2jU4PLtyyimMz72z285)Worktree:
objectstack-issue-31115Domain:
domain:skillsSeat:
domain:skills#2File surface:
scripts/check-skill-links.mjs(new) with its self-test;scripts/check-skill-identifier-liveness.mjs(three section entries);scripts/check-skill-compatibility-version.mjs(body versions +--fix);package.jsonscript lines; the one CI line wherecheck:skill-*already runs; theskills/**lines the new checks flag (with an@objectstack/skillspatch changeset if a skill text moves) (stop on breach; explain in the report)Container & model:
M,mode:thread,model: TIER_DEFAULT(dispatch-gates --tieris re-run on the real diff by the dev; the path list names a not-yet-written file),effort: highClause-②: no
Metadata-protocol: none
Responsibility:
n/a — not a defect cardThread-read: 6708443569
Premise: holds. The ruling 6708443569 names item 1 (maintainer 「同意」); the two text-fix cards filed alongside (#31130, #31131) are closed; each "Caught today" item is re-measured by the dev on current
main.Serial constraints cleared: PR #31377 (#31299,
domain:skills#3) editsskills/objectstack-platform/SKILL.mdand PR #31335 (#31235,domain:skills#3) editsskills/objectstack-platform/references/operations.md: if this card must edit either file, it mergesmainafter they land. No other open PR touches the surface.Dispatch order: pasted verbatim into the card thread's opening message (common rules + order, from the seat folder
skills-seat-2/of the project files). Writes: PR only via relaypr_create; comments, labels and bodies only viascripts/pmwrite tools; no GitHub MCP writes.objectstack-fleet commentedon Nov 8, 2026
domain:skills#2 · zhuangjianguo · session_01QsR2jT34CXs5fCn3BDirZw
Decision owed on item 3 · 2026-11-08T06:26Z
The dev (
session_01QsR2jU4PLtyyimMz72z285) returnedneeds_decisionon item 3 only; items 1 and 2 and the option-independent half of item 3 keep building. The question is put to the maintainer. The seat recommends B. The dev's analysis follows verbatim.#31115 item 3 — needs_decision: where the body-pin
--fixwrites landMeasured on objectstack 3a0aa91 (worktree objectstack-issue-31115).
The fact that forces a choice
The card asks
--fixto rewrite the install-shape body pins (skills/objectstack-platform/references/bootstrap.md:147-153, five"@objectstack/<pkg>": "18.3.0"lines) "as it already rewrites the frontmatter".--fixruns at version time (rootversionscript, last step). Two readers depend on WHICH files that writer writes:release.yml"Validate the post-version tree" (L725-748) admits only the pathsstampedSkillPaths()returns; any other path the version pass writes isunexpectedand the release PR job fails ("a new version-time output must arrive together with the gate that judges it").scripts/check-skills-token-ratchet.mjsreadsstampedSkillPaths()as "files carrying a frontmattermetadata.versionstamp" and leaves exactly that one line unpriced. Its self-test (repinMisses,notTheStamp) reds any stamped file without such a line, so addingbootstrap.mdtostampedSkillPaths()reds the token ratchet.bootstrap.mdheadroom today: 1 token. A width change at release (18.9.0->18.10.0: +5 bytes over five pins;19.0.0-next.0: +35 bytes) reds the ratchet on the Version Packages PR — the exact incident the stamp-line exclusion (STAMP_LINE_REPINin the ratchet header) was built to end.Check-only (no
--fixon bodies) is not an option:release.ymlrunspnpm check:skill-compatibilityin the post-version content half, so the first version bump reds the release job.Options
--fixrewrites body pins; new exportbodyPinnedPaths();release.ymlpost-version guard gains a sixthgrep -vxF -flist (one more file outside the claim surface:.github/workflows/release.yml). Body pins stay priced: the width trap above stays open onbootstrap.md(1 token headroom).stampLine()"ask the writer with a probe" to body pins). Closes the width trap. Two files outside the surface (release.yml,check-skills-token-ratchet.mjs); the ratchet file is also edited by PR docs: teach os mcp connect and the use-runtime deploy target in the remaining pages #31335 (different hunks: its CEILINGS rows), so this card merges main after docs: teach os mcp connect and the use-runtime deploy target in the remaining pages #31335 lands.N.xpins),--fixrewrites body pins only when the major moves. Surface unchanged exceptrelease.ymlstill needs the list at a major. Halves the value:bootstrap.mdcan teach18.3.0through all of 18.x.--fixleg and the body-pin rule from this card; ship the history-sentence check only (versions in prose must be equal or read as history). File the install-pin half as its own card for a decision. Smallest diff; card acceptance for item 3 left half-done (Part of).Four axes
objectstack-platform/references/bootstrap.mdstill teaches^17.0.0for every @objectstack/* dependency, while the scaffolders now write the exact version (the governed half of #25510) #25666). A and B serve it; C serves it only per major; D defers it.--fix), which is the frontmatter precedent; C still lets a hand-typed stale minor stand; D leaves it hand-typed.Recommendation
B, because it is the frontmatter precedent applied whole (derived, never typed, unpriced, declared to the release guard) and leaves no release-time red; cost is two files outside the claim surface (
release.ymlsix-ish lines, token ratchet stamp handling) and a merge of main after #31335. If the seat prefers not to widen the surface, D with a follow-up card.While this is open I build items 1 and 2, and the option-independent half of item 3 (body walk, the equality/history rule, the self-test), and hold the
--fix/release wiring.objectstack-fleet commentedon Nov 8, 2026
domain:skills#2 · zhuangjianguo · session_01QsR2jU4PLtyyimMz72z285
os-dev-report
Part of #31115)dispatch-gates --tiernames claude-fable-5-1 for skills/** clause ①; (2) two port-table clauses in operations.md deleted to pay the token ratchet for the 10-kind generate row; (3) item 3 committed as f6a7e61 and reverted as 11be773 (git revert, no rewrite), held for its own PR pending the maintainer's rulingGenerated by Claude Code
objectstack-fleet commentedon Nov 8, 2026
domain:skills#2 · zhuangjianguo · session_01QsR2jT34CXs5fCn3BDirZw
Landed (items 1 and 2) · 2026-11-08T08:37Z — PR #31432 merged through the merge queue (os-zhuang, merge commit 4941c40):
check:skill-linksplus three new exhaustive bindings incheck-skill-identifier-liveness. The card stays open for item 3, which waits on the maintainer ruling in decision comment 6718224824 (options A–D, seat recommends B);needs-user-decisionadded. The item 3 patch is kept in the seat's project files (issue-31115/item3.patch).