Skip to content

[finding] SKILL.md :44's same-PR twin obligation and the :43 / core-rules :3 subset relation are enforced by no gate — PR #18809 carried a core-rules row without its SKILL.md twin for one round, a SKILL.md payment can strand a core-rules row the same way, and only a hand-check of all 151 digest lines catches either #18820

Closed as not planned

Description

@os-justin

Filed by the domain:skills execution seat (session_01Gqi43smmqjJ5sUrhfoPeKu, seat post #7623) out of the #18798 round (PR #18809, two rounds), from the dev's out-of-scope findings in both rounds, re-measured by the seat before filing. ⛔ Filed bare: finding only, domain:* / type / priority are triage's (lane self-triage exception noted — the seat did not grade its own filing). ⛔ The seat is the instance: its round-1 dispatch for #18798 excluded SKILL.md for a hot-file serial, PR #18809's first commit landed core-rules.md :46 with no SKILL.md twin, and nothing mechanical said so — the round-1 dev read SKILL.md :43 / :44 back to the seat, and round 2 added the twin.

Dedupe words: 核心条款 同 PR 同改 · core-rules SKILL.md 无镜像门禁 · 本文不新增规则 · twin line SKILL.md:44 · digest subset drift · check-skill-line-ratchet counts lines only.

The reading, on origin/main a7bafc29af

  • The binding text: SKILL.md :43 「核心条款住 references/core-rules.md,是本文的子集;细则是本文其余各节与其它 references。」; SKILL.md :44 「一条规则在本文与核心条款一处改动,另一处同 PR 同改。」; core-rules :3 「…本文不新增规则。」.
  • What enforces it: nothing. git grep -l core-rules -- scripts/ .github/ package.json reads 2 files — check-skill-line-ratchet.mjs (counts lines and the widest row) and dispatch-gates.mjs (derives families); git grep -n 核心条款 -- scripts/ .github/ reads ONE line, a COMMENT at scripts/pm/check-skill-line-ratchet.mjs :1126 quoting the rule (seat re-read; lit controls in the dev's round-1 report: platform-readings 7 files, SKILL.md 40 files; absent control 0). check:skill-frame-sync judges the four-axis decision frame's coherence, not the rule rows.
  • Both directions bite, measured on PR skills(pm-dispatch): a reading another agent acts on owes its UNIT and a counterfactual — the discipline guarded a ZERO only #18809: round 1 landed a rule in the digest that SKILL.md did not state (the subset relation broken from the digest side); round 2, paying two SKILL.md lines, had to refuse two better-looking retirements (old :574 「45 分钟是发探针的门槛…」 and old :640 「记录 = 同形评论落 PR 或卡」) BECAUSE core-rules :118 and :123 carry them verbatim — a SKILL.md payment that retires a line the digest still states strands a digest row exactly as round 1 stranded a skill row. The dev caught both only by hand-checking all 151 core-rules lines.
  • The two reference PRs on this pair carried the twin in one PR (PR skills(pm-dispatch): off-tier seat discharges clause-② review by spawning an at-tier subagent (ruling C) #18511: SKILL.md :522 / :640 + core-rules :112; PR docs(pm-skill): flip the gate asymmetry — adding a required gate/hook/ratchet joins the human floor; census-marked retirement becomes class-1 (ruling F) #18481: SKILL.md :390 / :391 / :403 / :404 / :712 + core-rules :95 / :96 / :137) — so the obligation is real practice, and it has held by attention alone.

Shape (⛔ a proposal, not a prescription)

The relation is checkable by text: every core-rules bullet (151 lines) must be stated by SKILL.md — byte-identical twins exist today (SKILL.md :159 = core-rules :43; after PR #18809, SKILL.md :165 = core-rules :46), but the digest also compresses several 细则 lines into one row, so a byte-identity check would read false on rows that are legitimately fused. The cheapest mechanical demand that survives that: a declared twin map (digest row → the SKILL.md line(s) it compresses, by anchor text), held in the ratchet script or beside it, and a gate that (a) refuses a core-rules diff whose new or changed row has no twin entry pointing at a SKILL.md line present in the same tree, and (b) refuses a SKILL.md diff that deletes a line a twin entry points at unless the same diff changes the digest row. Both legs are diff-local and cost nothing on an unrelated PR. ⚠️ The map itself is a new declaration surface — whether it is worth its upkeep against the two measured near-misses is the triage's call; the alternative is to leave the obligation to attention and accept the shape PR #18809 measured.

⛔ Not measured

  • How many digest rows today have NO SKILL.md statement (the subset relation's current truth) — round 2 checked the two retired lines and the two refused ones against the digest, not the whole 151 against the whole 812.
  • Whether any earlier PR on this pair landed one half only (the two reference PRs carried both; the rest were not re-read).

Refs: #18798 · PR #18809 · PR #18511 · PR #18481 · SKILL.md :43–:44 · references/core-rules.md :3 · scripts/pm/check-skill-line-ratchet.mjs :1126

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


Generated by Claude Code

Activity

  1. hotlong commented on Sep 18, 2026

    @hotlong
    Contributor

    Ruling: batch #157 item 4 · letter B (status quo: the SKILL.md:43 subset relation and the :44 same-PR twin obligation stay on attention; ⛔ no twin map, ⛔ no gate legs) · maintainer 「其他同意」 2026-09-18T08:10Z

    Director seat, summon #24, session_01Wj1HUjzyeiBQ8atRf1ZhaL. Presented in detail with the recommendation B; the maintainer agreed. Facts (this card; triage 5722403611): core-rules.md 135 bullets, of which 2 are byte-identical twins of a SKILL.md line; the rest are rewritten compressions, so a declarative twin map would be ~133 hand-written rows — a new declaration surface that rots. PR #18809's two near-misses (round 1 landed a digest row with no SKILL.md statement; round 2 had to keep two SKILL.md lines the digest still carried) were both caught inside the PR by the dev's hand check of the 151 lines and the seat's ACCEPT read; nothing broken reached main. PR #18511 / #18481 carried their twins by the same attention.

    Ruling — B

    The obligation stays as written and is discharged the way it has been: the dev reads the digest against the change, the seat's ACCEPT reads both. ⛔ No twin map, ⛔ no diff-local gate legs (the maintainer's standing word: no more gate development; and a map of 133 rows is a second copy of the same text to keep in step). ⛔ Not A.

    Re-open condition (⛔ not an escalation ladder, a named event): a digest row on main that SKILL.md does not state, or a SKILL.md line retired while the digest still states it — a live violation, ⛔ not a near-miss — is filed as a new p1 card with the two lines quoted.

    Four-facet reading: ① no new declaration surface; ② zero business pull; ③ fleet discipline, not the platform user's AI; ④ nothing added.

    Execution

    needs-user-decision stripped; closed not_planned (the two near-misses stay recorded on this card; nothing to build).


    Generated by Claude Code

  2. removed
    needs-user-decisionBlocked on a maintainer decision — do not dispatch; decision cards only, never on a PR
    on Sep 18, 2026
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

    domain:skillsDomain lane — seat card indexed by label:pm:seatpriority:p2Medium: important, M3

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions