Skip to content

[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

Description

@objectstack-fleet

Ruled: 6050857613 · letter B (probe first) · 2026-10-08T02:24Z

Filing gate: ② a decision only the maintainer can make — whether the published skills/** catalog gets a CI gate over its teaching content (the evals/ fixtures scored in CI, or a schema check over the skill texts' example blocks), which SKILL.md:255 makes a maintainer-named act (新增门禁默认否), or stays maintainer-scored offline as skills/README.md:67 says today. Filed by domain:skills seat 2 (seat post #19287, session_0181E4ZeZmWyknawnauxD2CE) on the maintainer's instruction in this session, verbatim: 「创建卡片,暂时不派发。」 ⛔ Not a claim, ⛔ not a dispatch.
Reader: the maintainer (the needs-user-decision inbox); after the ruling, the domain:skills seat executes per 「裁后执行」 below.
Dedupe: REST listings, closed included (labels=tooling since 2026-09-07: 417; labels=needs-user-decision since 2026-09-07: 2; every issue updated since 2026-10-01: 625; domain:skills since 2026-09-23: 109; union 1,030) grepped for evals? (in|as|to) CI|published skills|skills/\*\*|skills catalog|skill eval → 3, all closed programs: #13658 (factual sweep of every behavioural claim in skills/**), #14292 (skills catalog optimization program), #19715 (the four SKILL.md files over 500 lines). None asked for a gate. Existing mechanical coverage read from package.json and scripts/: five structural gates (check:skill-identifier-liveness, check:skill-frame-sync, check:skill-frame-freshness, check:skill-compatibility, check:skill-top-level-keys) and the lexical ratchet check-corpus-claim-drift.mjs (#13582) — none reads what an example teaches.

维护者速读

问题:近两周 skills 车道 109 张卡里有 21 张是发给客户的 skills/objectstack-* 教错(ui 7 张,ai、api、i18n、upgrade、data 各若干;其中 p1 四张,如 #21567 把公开表单的三个共享键只写了两个、#21537 把容器表单写在不存在的 formViews.default 下)。每一张都是人读出来、立 finding、再派人修,中位 9 小时关单。十个 skill 都带 evals/ 夹具(12 个 JSON、prompt→expected_output 对),但 README 写明它们是「维护者离线打分用」,CI 不跑;五个结构门只查 frontmatter、标识符与版本号,不查示例教的对不对。

推荐:B——不跑 evals,而是在既有门 check-corpus-claim-drift 的盲区上补一步:把 skills 文本里的示例代码块按 packages/spec 的 schema 校验,spec 一变就红。第一步先做一次探针:用这个校验回扫这 21 张卡的修复 diff,数一数能抓住几张;抓不到一半就改选 C(不加门)。A(模型在 CI 里给 evals 打分)不荐:不确定性门禁是随机红的新来源。

你要做的:回一个字母 A / B / C / D。B 或 A 都算「新增门禁」,按规则要你在回批里点名;C 本卡即关。

Governing text

  • .claude/skills/pm-dispatch/SKILL.md:255: 「新增门禁默认否:门禁是只减不增的零件,例外只有维护者点名;荐新增门禁须引其点名原话,否则荐「不加」。」 — this card has no naming to quote, so its default recommendation would be 「不加」; B is offered as a blind-spot fix of an existing gate and the maintainer decides whether that reading holds.
  • .claude/skills/pm-dispatch/SKILL.md 〈升级与决策〉 不升级类: 「既有门禁内部参数与盲区修复(加强,非削弱,非新增)」 — the clause B leans on.
  • .claude/skills/pm-dispatch/references/filing-gate.md:44: 「北极星第 4 条只认出货面(skills/**、产品文档),⛔ 不含 .claude/** 内部协议。它认的是一句说错的话,⛔ 不是一句缺席的话。」
  • skills/README.md:67: "evals/ — skill eval fixtures — used by maintainers to score the skill".
  • scripts/pm/check-skill-line-ratchet.mjs:2938-2941: "Extending coverage to the published catalog is a policy change — it lands with a maintainer ruling" (said of the line ratchet; the same posture is read here for any new coverage of skills/**).
  • Protocol statement: A and B change the protocol (a gate the published catalog does not have today); C and D do not.

前提(每条带 re-check 命令)

  1. 21 of 109 domain:skills cards updated in the two weeks before this filing concern published skill text; the ids read: finding(skills): the objectstack-ui skill authors a container's create/edit form under formViews.default / formViews.edit, which PR #21535 serves as a named form, never the default #21537, skills(objectstack-api): the published public-form opt-in names two of the three sharing keys the anonymous form endpoints require — an AI following it authors a form both endpoints answer 404 #21567, finding(skills): objectstack-ai's Common Pitfalls says "memory is declared only — no runtime reads it"; once PR #21413 lands, the cloud AI runtime enforces it and the spec refuses its old shapes #21415, skills/objectstack-i18n: the _actions row and the translation-target-unknown paragraph omit the action-entry keys os validate judges (param options, outcomeMessages, resultDialog leaves and fields) #21583, skills/objectstack-ui: the kind: 'html' page example writes <object-metric aggregate="count">, a string the html tier only warns on and the tile cannot draw #21627, skills(objectstack-ui): the dashboards rule says Postgres buckets with date_trunc; the SQL driver groups by to_char(... AT TIME ZONE UTC) on Postgres #21588, skills(objectstack-ui): the dashboards rule tells authors to override a compareTo series with series.dashArray / series.opacity — a dashboard widget's chartConfig.series is a tombstone the schema refuses by name #21211, finding(skills, docs): published AI-author text still describes guardrails as unenforced and outputSchema as never validated; the cloud AI runtime now enforces both (objectstack-ai SKILL.md, actions.mdx) #21288, finding(skills): the objectstack-upgrade skill's "v17-canonical shapes, compiled" block authors a select with no options, which FieldSchema refuses once PR #21390 lands #21392, skills(objectstack-ui): dashboards.md teaches the measure-currency chain with no currencyMode: 'fixed' condition and cites ADR-0053 — remainder (a) of #20126 #20196, skills(objectstack-ui): pages.md and its eval teach full Action objects in page:header.properties.actions; the contract is action ids (ruling B on #11592) and os validate flags the taught shape #20173, finding(skills,docs): the currency teaching in field-types.md and field-types.mdx contradicts the spec: dynamic is taught as a per-record { value, currency }, and the resolution order has no mode #20090 and nine more. — gh api 'repos/objectstack-ai/objectstack/issues?state=all&labels=domain:skills&since=YYYY-MM-DDThh:mmZ&per_page=100' --jq '[.[] | select(.title|test("skills\\(objectstack-|skills/objectstack-|finding\\(skills"))] | length' (the window's start instant, 2026-09-23T00:00Z, goes in since=)
  2. The evals are 12 JSON fixtures and 3 README files across 10 skills, prompt/expected_output pairs with no runner in the repo. — find skills -path '*/evals/*' -type f | wc -l and grep -rn "evals" package.json .github/workflows | wc -l
  3. The five check:skill-* gates read structure (frontmatter keys, identifiers, versions), not example semantics. — grep -c '"check:skill-' package.json
  4. check-corpus-claim-drift.mjs is a shrink-only lexical ratchet over the teaching corpus, skills/** included, pinned to the [finding] The teaching corpus has no lexical anti-drift pin, so a filter operator's prose can contradict its driver forever — the reachable half of "no gate can catch it" #13582 claim family. — sed -n '1,40p' scripts/check-corpus-claim-drift.mjs
  5. None of the 21 fixes touched a gate; each was a text correction after a human reading. — the cards' PRs (closed_by_pull_requests) list skills/** paths only.

一句话问题

发给客户的 skills 教错了,是继续靠人读出来,还是让机器在 spec 每次变化时去撞一下示例。

选项 × 真实代价

选项 做什么 车队可感知后果
A 把 evals/ 夹具交给模型在 CI 里打分,低分即红 教错能更早被发现;但模型打分不确定,随机红成为新的假红来源,且每次 CI 多一笔推理成本
B 在 check-corpus-claim-drift 的盲区上加一步:skills 文本的示例代码块按 packages/spec schema 校验;先探针回扫 21 张卡的修复 diff 验证命中率 结构性教错(错键、错嵌套、过期拼写)在 PR 期响亮红;语义性教错(规则说反)仍靠人;确定性、零推理成本
C 不加门:继续人读 + finding 立卡 现状:每张教错存活到有人读到,中位 9 小时关单,p1 四张/两周
D B 的校验器只做离线报告,不进 CI 有读数无阻断;和 evals 一样会被遗忘

业务含义直译

A = 「让 AI 批改 AI 写的教材,红了就拦」;B = 「教材里的示例必须能被规范解析」;C = 「客户先撞上,我们再改」;D = 「有个体检表,没人看」。

四轴论证(从业务立场)

  • 实际业务需求:实测拉动 21/109,其中 p1 四张,全部是出货面上一句说错的话(北极星第 4 条正是为它设的);每张教错都可能被一个客户的 AI 照抄。有拉动。
  • 项目长远合理性:B 是 contract-first 的直接延伸——spec 是声明,示例必须服从声明;它复用已有的 schema 与已有的 corpus 门,不新造机制。A 引入一个非确定性门,长期要养阈值和重试。
  • 防 AI 犯错:AI 写教材最常犯的是结构错(键名、嵌套、过期拼写),这正是 schema 校验能响亮拒绝的那一类;语义错(规则说反)两种方案都抓不全,B 诚实承认。A 的误判会把真错误和噪声混在一起。
  • 创业阶段不扩散:B 不加 workflow job、不加推理成本,是既有门的盲区修复;A 加新零件;C 零成本但把成本转嫁给客户;D 是声明而不兑现。

推荐 + 回退 + 置信缺口

推荐 B,带前提:先做探针(用校验器回扫 21 张卡的修复 diff),命中率低于一半即改荐 C。回退 C。置信缺口:未测校验器对这 21 张的命中率;未测示例代码块的提取是否能覆盖 skills 文本里的所有代码围栏形态(TS、JSON、YAML 混用);不知道维护者是否把 B 读作「新增门禁」。
自检行:只看①选 B;②③④ 是否翻转:否。
终态句:两年后每份发布的 skill 示例都能被平台自己的 schema 解析,教材与规范是一个源;参照主流做法,文档代码块进 CI 做 doctest 是常态(Rust doctest、mdBook test)。

os-decision-facets
① 项目长远合理性:B 让示例服从 spec 声明,复用既有门,不新造机制;A 养一个非确定性门。
② 实际业务拉动:两周 21 张出货面教错卡、p1 四张,每张都可能被客户的 AI 照抄。
③ 防 AI 犯错:schema 校验在 PR 期响亮拒绝结构性教错;模型打分把真错与噪声混在一起。
④ 创业阶段不扩散:B 不加 job 不加推理成本;A 加新零件;D 是声明不兑现。
Prior rulings read: skills,evals,gate,corpus,teaching,published,catalog → 101 ADR / 47 AGENTS.md / 920 spec term hits, 10 ADR candidates, none on the published catalog; ADR none; thread: #13658, #14292, #19715, #13582
推荐 B(带探针前提);选项 A / B / C / D;自检「只看①选 B;②③④ 是否翻转:否」。置信缺口:命中率未测;围栏形态覆盖未测。

裁后执行

  • B:一张 domain:skills 卡,两步:① 探针——提取 skills 文本示例代码块、按 packages/spec schema 校验、回扫 21 张卡的修复 diff,报命中率;② 命中率过半才接着把校验接进 check-corpus-claim-drift 的同一 CI 步(不加 job),含自测与 21 张中的若干作为固定夹具。
  • A:一张卡定 evals 运行器、打分模型与阈值,先离线跑 100 次量方差再决定进不进 CI;本席不荐。
  • C:本卡以 completed 关闭;出货面教错继续走 finding 立卡(北极星第 4 条)。
  • D:同 B 的①,不做②;校验器作为 scripts/check-*.mjs --report。

Related: #13658 · #14292 · #19715 · #13582 · the 21 cards named in 前提 1.


Generated by Claude Code

Activity

  1. added
    toolingFix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface
    needs-user-decisionBlocked on a maintainer decision — do not dispatch; decision cards only, never on a PR
    on Oct 7, 2026
  2. objectstack-fleet commented on Oct 7, 2026

    @objectstack-fleet
    ContributorAuthor

    Box intake (triage): domain:skills · priority:p3 added. The card's shape is complete: 维护者速读, the option table with costs, the four axes, Prior rulings read:, the confidence gap and 裁后执行 are all present. The quoted rule text was checked on main: SKILL.md:255 carries 「新增门禁默认否」, and skills/README.md:67 says the evals/ fixtures are "used by maintainers to score the skill".

    Triage seat (objectstack-wide, seat post #6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-07T06:00Z. ⛔ Not a claim.

  3. objectstack-fleet commented on Oct 8, 2026

    @objectstack-fleet
    ContributorAuthor

    Ruling: batch #287 item 2 · letter B (with the probe as its precondition) · maintainer 「批 #287 同意」 2026-10-08T02:21Z

    Director seat, summon #35, session_01VYToj6PQehTEKNrjGM9akg (GitHub os-zhuang; written as objectstack-fleet[bot] via the relay). Batch #287 was presented in chat twice, the second time in the detailed form the maintainer asked for, with this card's options A / B / C / D and the question whether B counts as a new gate under SKILL.md:255 (新增门禁默认否); the maintainer answered 「批 #287 同意」, which takes B as presented: the seat's framing of B as a blind-spot fix of the existing check-corpus-claim-drift gate, and, where that reading is contested, the maintainer's own word on this batch is the naming the rule asks for. Freshness gate: the body and the one comment (6031996518, triage's intake) were re-read before this record; nothing newer exists. Thread-read: 6031996518.

    The ruling

    B, in two steps, the second conditional on the first.

    1. The probe. Extract the example code blocks from the published skills/objectstack-* texts (TypeScript, JSON and YAML fences alike; a TypeScript example needs a transform into a shape the schemas accept, and whether that transform covers the catalog's fences is what the probe measures), validate them against packages/spec's schemas, and replay the validator over the fix diffs of the 21 teaching-error cards named in the card's premise 1. Report the hit rate.
    2. The gate step, only if the hit rate is at least one half. The validation joins check-corpus-claim-drift's own CI step (no new job, no model call, no inference cost), with its self-test and several of the 21 cases as fixed fixtures. A structural teaching error (a wrong key, a wrong nesting, a retired spelling) then fails the pull request loudly; a semantic one (a rule stated backwards) still needs a reader, as the card says plainly. If the hit rate is under one half, the ruling falls to C: no gate, the finding process as today, and the probe's readings stay on this card.

    ⛔ Not taken: A (a model scoring the evals/ fixtures in CI: a non-deterministic gate that adds inference cost and a new source of false reds), D (an offline report nobody reads, the fate evals/ already has).

    Why B on the first axis: the spec is the declaration and a shipped example must parse under it; the check reuses the schemas and the corpus gate that exist, where A would add a part the project then has to keep calibrated.

    State

    • needs-user-decision → pm:queue in this act; tooling · domain:skills · priority:p3 unchanged, no assignee: the domain:skills seat claims the probe from its queue; the gate step follows on this card only on a passing probe. Body: Ruled: line added in the same act.

    Generated by Claude Code

  4. added
    pm:queueReady for the PM dispatch loop
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    needs-user-decisionBlocked on a maintainer decision — do not dispatch; decision cards only, never on a PR
    pm:queueReady for the PM dispatch loop
    on Oct 8, 2026
  5. objectstack-fleet commented on Oct 8, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 2
    Session: session_01CXydFDyiQwNbGFkmwrcRQq
    Account: huangyiirene (the seat's linked user as GET /user answers it; always the card's assignee)
    Branch: claude/issue-22059-skill-example-schema-probe
    Worktree: objectstack-issue-22059
    Domain: domain:skills
    Seat: domain:skills#1
    File surface: step ① of the ruling (the probe, this dispatch): scripts/check-corpus-claim-drift.mjs — a report-only probe mode beside its existing batteries, or a sibling module under scripts/ that it imports — with --self-test cases; the probe READS the published skills/objectstack-*/**/*.md texts and the fix diffs of the 21 teaching-error cards (REST reads) and reports the hit rate on this card. ⛔ In step ① no edit to skills/**, packages/spec/**, .github/workflows/**, package.json, scripts/corpus-claim-drift-baseline.json or scripts/pm/dispatch-gates.mjs (FROZEN). Step ② (the gate step: the validation joins check-corpus-claim-drift's existing CI step with fixtures) follows on this card and branch only on a hit rate of at least one half and only after this seat reads the probe report. Not a governed surface: a code PR, green + ACCEPT → queue landing. Stop on breach; explain in the report
    Container & model: M, mode:subagent, model: opus — dispatch-gates --tier --repo objectstack-ai/objectstack scripts/check-corpus-claim-drift.mjs prints no path-derived mandate ("the surface hits none of the 3 declared glob(s) … floor sonnet · default opus · ceiling fable"); reason: the default judgment tier for a measurement-first probe whose extraction and transform choices decide a gate ruling, judged from the card content
    Clause-②: no
    Responsibility: n/a — not a defect card (a ruled decision: letter B, ruling 6050857613, maintainer 「批 #287 同意」 at 2026-10-08T02:21Z)
    Thread-read: 6050857613
    Serial constraints cleared: no open PR touches scripts/check-corpus-claim-drift.mjs, its baseline or lint.yml (nine open PRs' file lists read at 2026-10-08T02:26Z); same-day churn none on the file (last touch cc1b8ac94d at 2026-09-13T08:08Z); file-disjoint from #22123 (same batch, skills/objectstack-upgrade/SKILL.md); scripts/pm/dispatch-gates.mjs FROZEN and not in this surface; verify lock free, queue empty (arrival depth 1 at this read); the lane's open P0/P1: none ⇒ p3 is a candidate (NORTH-STAR 「优先级」 3 read). Ruling-ref: 6050857613 (retrieved in this act, with its Governing text: items). Readings taken at 2026-10-08T02:28Z.


    Generated by Claude Code

  6. objectstack-fleet commented on Oct 8, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 22059,
      "status": "done",
      "branch": "claude/issue-22059-skill-example-schema-probe",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/22171",
      "session": "session_01CXydFDyiQwNbGFkmwrcRQq",
      "premise_still_valid": false,
      "summary": "Step one of ruling B is delivered as a report-only probe: `node scripts/check-corpus-claim-drift.mjs --probe-examples` (module `scripts/skill-example-probe.mjs`, exit 0 on any reading, wired into no check script, workflow or baseline), with four new self-test batteries (65 cases). HIT RATE 2/19 = 10.5% over the cards filed before #22059 that have a landed published-catalog repair (2/20 = 10.0% over all 20 the listing matched at filing; 2/22 = 9.1% over today's 22). The 2 hits are #20173 (page:header actions; ComponentPropsMap) and #21392 (select with no options; FieldSchema refinement), both in os:check blocks the TS type gate passes. Misses over the 22: prose 10, comment-or-string 4, neither 2, transform 2, not-in-corpus 1 (#18964), no-fix 1 (#22123). Ceiling with a perfect transform: 6/19 = 31.6%, because 9 of the 19 repairs touched no example fence. Transform coverage: 283 population fences (262 typescript, 16 ts, 1 tsx, 2 json, 2 jsonc, 0 yaml). Of the 279 TS fences, the transform produced a value for 203 (72.8%) and 115 (41.2%) were read and mapped whole. Control on today's catalog: 110 green, 3 red. Two of the reds are real teaching errors (`skills/objectstack-ui/rules/actions.md:77` and `:176`, both throw under the built `defineAction`; the TS gate `check:skill-examples` is green over :77). The third is the upgrade skill's deliberate protocol-16 example. Premise corrections: the listing gives 20 cards at filing, not 21 (#22120 and #22123 were created later; #18964 is a seat process finding). Four gates already read examples opt-in (check:skill-examples, check:yaml-examples, check:doc-formula-expressions, check:doc-security-posture). By the ruling's own terms the readings sit under one half; the step-two or C decision is the seat's.",
      "tests": "Head e6d00e1421. (1) `pnpm check:corpus-claim-drift`: exit 0, self-test OK with the Probe batteries at 14/18/21/12 cases, gate 'OK, no new claim sites' over 252 files. (2) `node scripts/check-corpus-claim-drift.mjs --probe-examples --json F`: exit 0. Apart from its head line, the output is byte-identical on every run from before the first commit to e6d00e1421. (3) Ablations via scripts/ablation-replace.mjs, each landed (anchor 1 to 0, blob moved) and each restored (blob == HEAD, git diff HEAD empty): opaque suppression off gives self-test exit 1 (2 cases); the HIT rule off gives exit 1 (1 case); the probe registration call off gives exit 1 (all 4 Probe batteries 'DID NOT RUN'). (4) `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` derived 30 commands; all 30 were run on e6d00e1421 and all exited 0, `pnpm check:pm-dispatch-gates` included ('1976 cases pass', EXIT=0). --ran reconciliation: 30 derived, 30 run, 0 UNRUN. Roster families under scripts/ also run: check-published-list-mirrors (both), check:dts-closure, check:engine-double-contract, check:i18n-stale-fill and check-dts-references --self-test exit 0. NOT MEASURED: check:published-readme-exports, reason: PREREQUISITE NOT MET, exit 3, 45 packages unbuilt. check:console-injection, reason: no console dist, skipped. Test Core CI shard steps and the type-check lanes are CI's own; no package TypeScript is touched. An earlier battery run on 4a648ffec1 failed 1 of 1976 cases (compound self-test function names unledgered). The names were fixed in e6d00e1421 rather than ledgered. (5) eslint narrowed to the 2 touched files: `eslint --no-inline-config --format json` gives 2 files, 0 errors, 0 warnings. The population is eslint.config.mjs `files: ['**/*.{ts,tsx,mts,cts,js,jsx,mjs,cjs}']`. Invariance: no parserOptions.project or typed rules, so the diff cannot move a verdict on an untouched file. (6) Control: `pnpm --filter @objectstack/spec run check:skill-examples` exits 0 ('262 prose examples type-check across 3 surface(s)') with actions.md:77 in it. The spec and the client-react closure were built first through os-verify-lock. (7) pnpm check:nul-bytes exits 0; the control-byte self-scan of both files is empty.",
      "mcp_calls": "0 — none",
      "api_writes": "3 relay dispatches — POST /repos/objectstack-ai/objectstack/dispatches ×3, executed as objectstack-fleet[bot]: (a) pr_create, i.e. POST /pulls (draft #22171; read back 13547/13547 bytes identical); (b) label-write, i.e. POST /issues/22171/labels (skip-changeset) plus POST /issues/22171/assignees (huangyiirene); read back matching; size/xl came from another actor; (c) this os-dev-report comment, i.e. POST /issues/22059/comments. git push is not REST. Reads (REST GET, not writes): issue 22059 and its comments (2), the domain:skills listing (3 pages), 22 card timelines, PR 22171 read-back (1).",
      "open_questions": [],
      "out_of_scope_findings": [
        "class: c · reach: copying the published example verbatim makes the built `defineAction(...)` throw at module load. Measured at e6d00e1421; os validate and the metadata save parse with the same ActionSchema. · evidence: skills/objectstack-ui/rules/actions.md:77 (os:check block 'Modal-typed action'): `type: 'modal'` plus `body` is refused by the ActionSchema refinement on `body` ('`body` only runs for `type: 'script'` …'). actions.md:176 ('opensInNewTab + newTabUrl'): `type: 'url'` with no `target` is refused: 'Action 'target' is required when type is 'url', 'flow', 'modal', 'api', or 'form'.' The TS gate check:skill-examples is green over :77. One family (one file, one schema): file as one card. · Seam: spec:ActionSchema refinements (body vs type, target vs type) → runtime:defineAction / metadata save · dedupe words: actions.md modal body · defineAction target required url · opensInNewTab newTabUrl target · Modal-typed action body script",
        "carrier: step two of #22059 if it lands (an expect-red convention), else 承接者:无 · noted, not filed — skills/objectstack-upgrade/references/examples-upgrade.md:7 reads red (connectors[].fieldMappings, label, type) because it is the deliberate protocol-16 FROM shape the upgrade skill migrates; a probe gap, not a teaching error (PR Acceptance notes)"
      ]
    }

    Generated by Claude Code

  7. objectstack-fleet commented on Oct 8, 2026

    @objectstack-fleet
    ContributorAuthor

    Close-out — ruling B step ① delivered, readings under one half ⇒ C · skills seat 1, session_01CXydFDyiQwNbGFkmwrcRQq, 2026-10-08T04:02Z

    ACCEPT of the probe readings (dev report 6051826214; PR #22171, head e6d00e1421), reviewed against the PR body's replay table and the tree, not the report's narrative:

    Decision, from the ruling's own text: "If the hit rate is under one half, the ruling falls to C: no gate, the finding process as today, and the probe's readings stay on this card." So: no step ②, no gate, no change to check-corpus-claim-drift's CI step. The readings stay here (the report above and PR #22171's body). PR #22171 is closed without merging (its note says why; the branch stays at e6d00e1421 as the probe's source of record). The card closes completed: the decision is made and executed.

    Premise corrections, acknowledged in public as the dev made them: the premise's listing matched 20 cards at filing, not 21 (#22120 and #22123 were created after this card; #18964 is a seat process finding, not in the published corpus). Four existing gates already read example blocks opt-in (check:skill-examples, check:yaml-examples, check:doc-formula-expressions, check:doc-security-posture), against the body's "none reads what an example teaches": the correct sentence is that none reads a Zod refinement, which is where both HITs and both new reds sit. No follow-up card: nothing further turns on either correction once C is taken.

    Carriers for the dev's acceptance notes: the expect-red convention for the upgrade skill's FROM shapes, the 86 ownership misses and the Plugin hold-out were gaps a gate would have had to close; with no gate they have no carrier and are recorded here only.

    State: pm:dispatched and the assignee come off in this act; closed completed. Reads and writes of the delivery: mcp_calls 0; api_writes 3, all relay dispatches as objectstack-fleet[bot].


    Generated by Claude Code

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:p3toolingFix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions