Skip to content

A metadata project's cards live in that project's repo — hotcrm's decision cards included; only platform problems are filed on objectstack/objectui: fix the three SKILL.md rows and the core-rules twins that send them to the objectstack inbox #17288

Description

@os-justin

Filed by the domain:skills execution seat (session session_01MoTv7pn338AZ71owsp19gQ, GitHub os-justin) at 2026-09-10T03:2xZ under the maintainer's direct instruction in this seat's chat session (直派通道; labels set by this seat, ⛔ not a triage grading). Queued, not claimed: it edits .claude/skills/pm-dispatch/SKILL.md, which #17285's dev is editing now — serial after #17285 lands, ⛔ not folded (different subject).

裁决 — the maintainer's words, verbatim and untranslated (chat, 2026-09-10T03:2xZ)

「hotcrm 所有的卡本来就应该在 hotcrm,包括其他元数据项目。除非元数据项目发现平台由问题,给平台立卡片。现在就是这么 操作的」

Read: a metadata project's cards — work cards AND decision cards — live in that project's own repo (hotcrm, and every other metadata project); the only cards a metadata project files on the platform are platform problems it finds, and those go to objectstack / objectui as ordinary platform cards. That is the practice today; the rule text says otherwise in three rows.

The rows that disagree with the practice (origin/main d64bcb63)

  • SKILL.md:191 「单车道仓 repo:* 席自理机械三务,⛔ 不产 domain:*;决策卡默认入 objectstack 收件箱。」 → the decision cards of a single-lane repo live in that repo's own inbox (needs-user-decision there); nothing defaults to objectstack.
  • SKILL.md:210 「维护者收件箱恒为 objectstack;在飞卡 ⛔ 不中途转仓。」 → the maintainer's inbox is per repo: objectstack and objectui for platform decisions, each metadata project for its own; keep 「在飞卡 ⛔ 不中途转仓」.
  • SKILL.md:235 「目标仓不可达时按缝卡规则落 objectstack 带 repo:* + 具名读者。」 → an unreachable target repo is a reading gap, not a home: the card is filed in the target repo by a seat that can reach it (the request rides the seat post or a coordination card until then); the seam rule (:207–:209) stays for genuine coordination cards only.
  • references/core-rules.md:55/:57 twins: same PR.
  • references/lanes/hotcrm.md:15 「建设 hotcrm 时发现的平台能力缺口,立普通平台卡到 objectstack 或 objectui。」 is already the practice — keep; add the mirror sentence: hotcrm's own cards, decisions included, live in hotcrm; :18 (「repo:hotcrm 缝标签只给真协调卡」) stays.

Measured practice, 2026-09-10T03:2xZ

Acceptance

  1. The three SKILL.md rows and the two core-rules twins say what the ruling says, in place, within the 812 / 151 ceilings (net-zero or fewer lines); the hotcrm charter gains its mirror sentence within its ceiling.
  2. pnpm -s check:skill-line-ratchet, check:skill-frame-sync, check:skill-compatibility, check:pm-skill-id-lint green; no issue numbers in skill files (cite the ruling by date).
  3. PR body: Fixes #<this card>, the ruling verbatim at the head, before/after quotes for every changed row, ## 维护者速读(草稿), ## Acceptance notes; governed (.claude/**) ⇒ draft, four-piece, skip-changeset.
  4. Serial: opened only after Model-tier policy: the contract-review tier is reserved for the skills seat (three protocol files + the published skills/** catalogs), the spec seat's clause-② review, and the maintainer-summoned director; triage and every other seat run the default tier #17285's PR has merged (same file); if Model-tier policy: the contract-review tier is reserved for the skills seat (three protocol files + the published skills/** catalogs), the spec seat's clause-② review, and the maintainer-summoned director; triage and every other seat run the default tier #17285's branch moves any of these rows, re-measure before editing.

Generated by Claude Code

Activity

  1. added theissue type on Sep 10, 2026
  2. self-assigned this
    on Sep 10, 2026
  3. os-justin commented on Sep 10, 2026

    @os-justin
    CollaboratorAuthor

    Claim: skills seat, session session_01MoTv7pn338AZ71owsp19gQ (GitHub os-justin), 2026-09-10T05:41Z — direct dispatch under the maintainer's chat ruling quoted verbatim in the body (直派通道); serial constraint discharged: PR #17294 merged 2026-09-10T05:05:11Z.


    Generated by Claude Code

  4. os-justin commented on Sep 10, 2026

    @os-justin
    CollaboratorAuthor

    Dispatched — R9, 2026-09-10T05:44Z, mode:subagent, build tier CONTRACT_REVIEW_TIER passed explicitly (clause ①). Claim 5613766483 is the dev's identity; branch claude/issue-17288-card-home. Runs in parallel with the sibling card (disjoint surfaces: .claude/** for #17288, everything else for #17311). Governed terminal: draft + four-piece, skills-seat self-review at the same tier.


    Generated by Claude Code

  5. os-justin commented on Sep 10, 2026

    @os-justin
    CollaboratorAuthor

    os-dev-report

    {
      "issue": 17288,
      "status": "done",
      "branch": "claude/issue-17288-card-home",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/17315",
      "premise_still_valid": true,
      "summary": "Five in-place line rewrites across three governed skill files, net-zero lines (812/151/53), every rewritten line under the ratchet's 120-byte width rule. SKILL.md 多仓协调: the 单车道仓 row now sends a single-lane repo's decision cards to its own inbox and not to objectstack; the 收件箱 row is per repo (platform decisions in objectstack / objectui, each metadata project's in its own repo; 在飞卡 ⛔ 不中途转仓 kept verbatim); the 目标仓不可达 row makes unreachability a reading gap, not a home (a reachable seat files in the target repo; the request rides the seat post or a coordination card until then). core-rules digest twin lands on the line already carrying 在飞卡 ⛔ 不中途转仓. hotcrm charter: hotcrm's own cards, decision cards included, live in hotcrm — folded into the existing 纯 hotcrm 修复住 hotcrm 仓 row so the exception row and the seam-label row stay byte-identical. Newest Claim (comment id 5613766483) named this branch; no claim or assignee written. Decision frame md5 22f2339f0acb64cdb50c7adc9db681c3 unchanged; lane table and tier rows untouched. Draft PR opened over REST with Fixes on the card, the ruling verbatim at the head, before/after per line, 维护者速读(草稿) and Acceptance notes; body read back byte-identical (GitHub drops only the trailing newline). Commit trailer pair as the harness instructed (Co-Authored-By names the model — the AGENTS.md reporting exemption for a harness-written trailer applies; the pair is noted, not rewritten).",
      "tests": "All on worktree commit 28dd4580 (origin/main 8c9bd8f5 + 1), exit codes captured before any pipe. pnpm check:pm-skill-ratchet exit 0 — SKILL.md is 812 lines (ceiling 812; headroom 0) / core-rules.md is 151 lines (ceiling 151; headroom 0) / lanes/hotcrm.md is 53 lines (ceiling 53; headroom 0), no line over the 120-byte budget. check:skill-frame-sync exit 0 — 2 copies of the decision frame are structurally isomorphic across 2 files, 76 markdown files scanned. check:skill-compatibility exit 0 — 11 SKILL.md file(s) reconciled against 80 workspace packages. check:pm-skill-id-lint exit 0 — 27 file(s) clean. check:pm-governed-prose exit 0 — 2 instruction surface(s) name all 5 registered governed surfaces and claim no others. check:nul-bytes exit 0 — scanned 8150 text file(s), no raw ASCII control bytes. check:pm-governed-merges exit 0. Whole-tree families check:agent-test-spelling, check:doc-authoring, check:driver-memory-census, check:refd-timer-probe, check:watch-hint-literal, check-closing-keyword-parity (+ --self-test), check-comment-mask-corpus, check-governed-queue-guard --self-test: all exit 0. check:doc-formula-expressions: first run exit 3 PREREQUISITE NOT MET (formula + lint unbuilt); built both under scripts/pm/os-verify-lock.sh (VERDICT command-exit 0, held 169s, waited 0s) and reran → exit 0, 14 predicate(s) judged clean; 6 skipped as undeterminable. node scripts/pm/check-governed-merges.mjs --test on the 3 files → exit 3, verdict: governed-surface predicate: 3 of 3 path(s) hit the register — GOVERNED. Derivation: dispatch-gates.mjs --commands without paths (changeset taken by the script: 3 committed paths vs merge base 8c9bd8f5) = 16 families, identical to the path-based preview; --ran reconciliation: 16 derived famil(ies) accounted for — 16 run, 0 NOT-MEASURED, one extra (check:skill-compatibility). No package source touched ⇒ no build closure and no package tests owed; repo-wide lint/test are CI's. No ablation applies (prose-only diff, no gate logic edited).",
      "gates": {
        "check:pm-skill-ratchet": "exit 0 — 812/812, 151/151, 53/53; no line over 120 bytes",
        "check:skill-frame-sync": "exit 0 — 2 copies isomorphic across 2 files",
        "check:skill-compatibility": "exit 0 — 11 SKILL.md reconciled, 11 pinned majors match",
        "check:pm-skill-id-lint": "exit 0 — 27 file(s) clean",
        "check:pm-governed-prose": "exit 0 — 2 surfaces name all 5 governed surfaces, claim no others",
        "check:nul-bytes": "exit 0 — 8150 text files, no raw control bytes",
        "check:pm-governed-merges": "exit 0",
        "check:doc-formula-expressions": "exit 0 after prerequisite build under os-verify-lock (first run exit 3 PREREQUISITE NOT MET, as the dispatch anticipated)",
        "whole-tree families (agent-test-spelling, doc-authoring, driver-memory-census, refd-timer-probe, watch-hint-literal, closing-keyword-parity + self-test, comment-mask-corpus, governed-queue-guard self-test)": "all exit 0",
        "check-governed-merges --test": "exit 3 GOVERNED — 3 of 3 path(s) hit the register",
        "dispatch-gates --ran": "16 derived, 16 run, 0 NOT-MEASURED, 0 UNRUN",
        "CI on PR 17315": "in_progress at report time — not waited for, per the dispatch contract"
      },
      "line_budget": {
        ".claude/skills/pm-dispatch/SKILL.md": "812 -> 812 (ceiling 812, headroom 0); rewritten widths 111->117, 71->114, 84->119 bytes",
        ".claude/skills/pm-dispatch/references/core-rules.md": "151 -> 151 (ceiling 151, headroom 0); rewritten width 90->118 bytes",
        ".claude/skills/pm-dispatch/references/lanes/hotcrm.md": "53 -> 53 (ceiling 53, headroom 0); rewritten width 67->111 bytes",
        "width rule": "MAX_LINE_BYTES 120 in check-skill-line-ratchet.mjs — every rewritten line at or under it; the PM's candidate wordings measured 128 / 123 / 121 / 136 bytes and were tightened"
      },
      "deviations": [
        "core-rules twin: landed on the digest line carrying 在飞卡 ⛔ 不中途转仓 (90 B, 30 B headroom) instead of the 单车道 line (119/120 B) and the 缝卡 line (116/120 B) the dispatch named — under the 120-byte width rule and the 151-line ceiling neither of those can take a clause without deleting text of a rule that did not change (their SKILL.md twins are byte-identical in this PR). The unreachable-target row has no digest twin today and none was added for the same reason.",
        "hotcrm mirror sentence: folded into the 纯 hotcrm 修复住 hotcrm 仓 row (the existing work-card half of the mirror) rather than into the exception row or the seam-label row, both of which the card says stay — they stay byte-identical.",
        "PR body footer: the repo's AGENTS.md session-URL footer form (one footer line under a rule line) was used instead of the harness's two-line attribution block — the session URL is preserved; two footers is the shape AGENTS.md warns against.",
        "PR creation over REST needed an explicit Content-Type: application/json header (one 415, then 201) — worth a line in rest-channel.md if the PM wants it; not filed (skill file edits outside this card's surface belong to the skills seat)."
      ],
      "files_changed": [
        ".claude/skills/pm-dispatch/SKILL.md (3 lines: the 单车道仓 row, the 收件箱 row under 规则 1, the 目标仓不可达 row under 规则 5)",
        ".claude/skills/pm-dispatch/references/core-rules.md (1 line: the 多仓协调 digest line carrying 在飞卡 ⛔ 不中途转仓)",
        ".claude/skills/pm-dispatch/references/lanes/hotcrm.md (1 line: the last 范围 row)"
      ],
      "labels": "none applied by this dev: Clause-② no (no needs:contract-review); skip-changeset is the PM's per the dispatch; PR carries no labels at report time (read back)",
      "mcp_calls": "0 — every read and write went over repo-scoped REST (probe GET issues/17288 → 200 at the start of the run; issue body, comments, objectstack-ai/objectstack#17250 body, PR create, PR read-back, report comment, comment read-back)",
      "open_questions": [],
      "out_of_scope_findings": []
    }

    Generated by Claude Code

  6. os-justin commented on Sep 10, 2026

    @os-justin
    CollaboratorAuthor

    ACCEPT — PR #17315 (head 28dd4580) reviewed in-seat at the contract-review tier (skills seat, session session_01MoTv7pn338AZ71owsp19gQ, 2026-09-10T06:25Z).

    • Implemented-by: os-dev subagent on branch claude/issue-17288-card-home (claim 5613766483; build tier CONTRACT_REVIEW_TIER passed explicitly; mode:subagent).
    • Reviewed-by: the skills seat, this session — independence pair holds (reviewer ≠ implementer); the seat's harness reading is the tier evidence.
    • Diff vs card: the three SKILL.md rows (:191 决策卡入本仓收件箱,不落 objectstack; :210 收件箱按仓 — 平台在 objectstack / objectui,元数据项目在本仓,在飞卡 ⛔ 不中途转仓 kept; :235 目标仓不可达是读数缺口,不是落点 — 由可达席在目标仓立卡) each implement one clause of the ruling quoted verbatim at the head of the PR body; the core-rules twin lands on the digest line that already carries 在飞卡 ⛔ 不中途转仓 (the dev measured the two lines the card named at 119/116 of 120 bytes — accepted); the hotcrm charter row 纯 hotcrm 修复住 hotcrm 仓 becomes hotcrm 自己的卡(含决策卡)都住 hotcrm 仓, with the exception row (:15) and the seam-label row (:18) byte-identical. No other line moved.
    • Verified in the review worktree /home/user/objectstack-review-17315: line counts 812 / 151 / 53 (ceilings, headroom 0); decision-frame block md5 22f2339f0acb64cdb50c7adc9db681c3 unchanged; pnpm -s check:pm-skill-ratchet exit 0; check:skill-frame-sync exit 0; check:pm-skill-id-lint 「27 file(s) clean」; check:pm-governed-prose 「2 instruction surface(s) name all 5 registered governed surfaces」; check-governed-merges.mjs --test exit 3 GOVERNED (3 of 3).
    • CI on 28dd4580 at 06:24Z: every check success or skipped; Check Changeset's newest run (06:06Z, after skip-changeset) is skipped.
    • Terminal: governed (.claude/**) ⇒ the PR stays draft; needs-user-decision placed on the PR, 速读 终稿 posted there, reviews requested from os-zhuang and hotlong; ⛔ not flipped ready, not enqueued, no auto-merge, no approval from this seat.
    • Not this PR (tracked): relocation of the six repo:hotcrm cards in objectstack (the maintainer's transfer or this seat's recreate — answer pending) and [Decision] 22 pure-objectui defect cards live in objectstack under repo:objectui, but objectui IS reachable — the seam fallback is being used where its precondition does not hold #17250's 22 repo:objectui cards (decision box).

    Generated by Claude Code

  7. os-justin commented on Sep 10, 2026

    @os-justin
    CollaboratorAuthor

    Landed — PR #17315 merged by os-zhuang at 2026-09-10T06:54:10Z (merge commit 47863f4fbe32, head 28dd4580), governed path (.claude/**): draft → human merge; this seat's ACCEPT verdict on this card bound to that head. Verified on origin/main cca1dc0bfb1e at 2026-09-10T07:26Z (the landed lines grep-present). Residue cleared in this same act: pm:dispatched off, assignee off; domain:skills and the type stay. Skills seat, session session_01MoTv7pn338AZ71owsp19gQ.


    Generated by Claude Code

  8. removed their assignment
    on Sep 10, 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

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions