Repository navigation
skills/objectstack-api still teaches target on an object_operation endpoint — dead key after #10338 optional-ized it #11291
Description
Activity
- changed the title
[-]skills/objectstack-api still teaches on an endpoint — dead key after #10338 optional-ized it[/-][+]skills/objectstack-api still teaches `target` on an `object_operation` endpoint — dead key after #10338 optional-ized it[/+]on Aug 23, 2026 Triage:
pm:queue+domain:skills(published skill corpusskills/**), type Task. Concrete, bounded: drop the deadtargetkey from theleadFeedexample (+ optional one-line "omittargeton object_operation" note within budget); the gate-description lines stay. Constraints already stated in the card and binding: governed surface (draft PR, human merge only), 2026-08-21 whole-package size-discipline readings in the PR body, minimal net growth — the skills seat sets the line budget at dispatch per the published-skills clause. Same-day churn: verify PR #11290's sweep landed on the ref you branch from so the skill edit matches the shipped vocabulary.
Generated by Claude Code
Claim: skills seat direct dispatch (maintainer 2026-08-24, live PM chat, verbatim 「一堆skills 的任务是不是应该派发处理了。」)
Session:5213b871-5164-5bc3-8874-28b336bbcd40
Branch:claude/issue-11291-api-skill-dead-target
Domain:domain:skills
File surface:skills/objectstack-api/**(thetarget-on-object_operationteaching + any example that spells it) — ⛔ published governed surface: draft PR, human merge, no ready-flip.
Clause-②: no accept/reject movement (docs-only correction to match #10338's landed reality) — but governed-surface landing rules apply regardless.
Serial constraints cleared: no open PR touchesskills/objectstack-api/**(open-PR sweep this hour); disjoint from the #11364 fold (different directory).
Generated by Claude Code
- added a commit that references this issue
on Aug 24, 2026 { "issue": 11291, "status": "done", "branch": "claude/issue-11291-api-skill-dead-target", "pr": "https://github.com/objectstack-ai/objectstack/pull/11748", "premise_still_valid": true, "summary": "Premise re-verified on current origin/main: packages/spec/src/api/endpoint.zod.ts:171 now declares target as z.string().optional() with a describe() saying it is REQUIRED at publish only for type:'flow' and UNREAD for type:'object_operation' — #11290 (commit d2619fd0) landed the #10338 change and swept examples/app-showcase plus the protocol/getting-started docs, leaving skills/** untouched because it was outside that card's file surface. Dropped target:'acme_lead' from the leadFeed example in skills/objectstack-api/SKILL.md; the file is hand-written (no GENERATED header — build-skill-docs.ts writes skills/README.md and content/docs/ai/skills-reference.mdx from frontmatter, build-skill-references.ts writes skills/*/references/_index.md, neither owns the body), so this is a hand edit, not a regeneration. NO explanatory note was added: the card made that note conditional on budget and the published-skills token ratchet had ZERO headroom on this file (ceiling 6348, file 6348) — a first attempt replacing the key with a one-line comment measured +16 tokens and drove check-skills-token-ratchet RED. The per-type rule is already stated in the file's unchanged gate description (~lines 212-214: 'an object_operation needs both objectParams.object and .operation; a flow needs a target'), so the corpus still teaches the contract and merely stops demonstrating the dead spelling. Also lowered that file's ratchet ceiling 6348 -> 6342 in scripts/check-skills-token-ratchet.mjs to lock in the saving, per the ratchet's own documented discipline ('A ceiling may be LOWERED by any PR that shrinks its file ... always legitimate and encouraged'). Size readings (2026-08-21 ruling), both negative: whole file 610 -> 609 lines / 6348 -> 6342 tokens; whole published package (11 SKILL.md) 10506 -> 10505 lines / 117922 -> 117916 tokens. Changeset: none, skip-changeset applied and read back — skills/ has no package.json, no published workspace package's files[] covers skills/ or scripts/, and the repo root is private:true, so nothing published moves. PR is DRAFT and stays draft: skills/** is a governed surface (Prime Directive #14), human-merge only, never queued or armed.", "tests": "Gates derived with `node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack` (no path args; script confirmed 'gate list derived from the tree of objectstack-ai/objectstack at commit dd4113ec' and '--repo ... checked against this checkout's origin remote — it holds'). Re-derived after scripts/check-skills-token-ratchet.mjs joined the diff: 8 families -> 13. Union re-run on the FINAL commit `0e5ea8cb`; exit codes captured before any pipe (each gate run redirected to its own log, then EXIT=$? read, then tail). All 17 green at 0e5ea8cb. Verdict lines quoted from the gates themselves: check:agent-test-spelling '✓ check-agent-test-spelling: 0 violations — 351 file(s)'; check:doc-authoring '✓ doc authoring guard: 389 files clean — no bare metadata literals.'; check:role-word 'check-role-word: OK, no new occurrences of the reserved word. Scanned: 225 .md/.mdx file(s) ... skills 36'; check:skill-compatibility '✓ check-skill-compatibility-version: 11 SKILL.md file(s) reconciled against 78 workspace packages'; check:skill-frame-sync '✓ check-skill-frame-sync: 4 copies of the decision frame are structurally isomorphic across 3 files'; check-skills-token-ratchet.mjs '✓ check-skills-token-ratchet: 11 published SKILL.md within their ceilings.' with bundle line 'skills/objectstack-api/SKILL.md 6342 / 6342 (+0)'; check:skill-examples '✅ 257 prose examples type-check across 3 surface(s)'; check:nul-bytes 'check-nul-bytes: OK (scanned 6553 text file(s) -- 6553 tracked, 0 untracked-not-ignored; skipped 5 binary; no raw ASCII control bytes).'; exit-0 with no distinctive verdict line: check:cross-package-test-inputs, check:doc-formula-expressions, check:entry-guard, check:parse-guard, check:pm-governed-merges, check:pnpm-filter-targets, check-cross-package-test-inputs.mjs, check:skill-docs, check:skill-refs. Repo-wide `pnpm lint` (eslint . --no-inline-config) run in FULL under the shared verify lock, exit 0 in 80s — no narrowed scan, so no narrowing claim to substantiate. TWO GATES INITIALLY REFUSED RATHER THAN MEASURED, both missing-build, neither a finding: check:doc-formula-expressions ERR_MODULE_NOT_FOUND on @objectstack/formula/dist (then on packages/lint/dist), and check:skill-examples refused with '❌ packages/client-react/dist holds no .d.ts declarations — the package is not built ... a FALSE GREEN on exactly the change it exists to catch (#7122)'. Both re-run to a real verdict after building the dependency closures (pnpm --filter '<pkg>^...' build, then the packages themselves); the greens above are the POST-BUILD runs, not the refusals. Verification of the fix itself: the edited example sits in an `<!-- os:check -->` fence, so check:skill-examples type-checks it — it compiles with `target` absent, which is the direct evidence that the vocabulary really made the key optional. All heavy commands ran through `bash scripts/pm/os-verify-lock.sh -c '<cmd>'` (verdict lines read, not bare $?). No ablation was performed: this is a prose/example correction with no gate behaviour to prove failable.", "open_questions": [], "out_of_scope_findings": [] }Notes for the PM, outside the JSON:
- No out-of-scope findings to file. I swept the whole published catalog for the same dead teaching:
grep -rln "object_operation" skills/returns onlyskills/objectstack-api/SKILL.mdandskills/objectstack-api/evals/README.md, and the latter's single line ("only object_operation/flow execute; script/proxy rejected at publish") is accurate and spells notarget.grep -rn "target" skills/objectstack-api/shows the remaining hits are unrelated: line 110 is ordinary English ("the target object"), lines 212-214 are the still-accurate gate description, and line 245 is theinputMappingdot-path sense. Nothing to widen into and nothing to report elsewhere. - One judgment call worth your eye. The card offered a one-line note as optional-if-budget-allows. The ratchet answered that question mechanically — zero headroom — so I delivered the pure deletion rather than expanding, and rather than reporting
blocked: the mandatory half of the card (drop the dead key) fits with room to spare, and the card itself made the note conditional. If you want the note anyway, it needs either a genuine deletion elsewhere in that file to pay for it or a maintainer ruling raising the ceiling; both are your call, not mine. - Landing reminder:
skills/**is governed. PR docs(skills): drop the deadtargetkey from the objectstack-api object_operation example #11748 is draft and must be merged by the maintainer by hand — not queued, not armed, not flipped ready.
Generated by Claude Code
- No out-of-scope findings to file. I swept the whole published catalog for the same dead teaching:
ACCEPT — reviewer of record: skills seat (dispatching seat), session
5213b871-5164-5bc3-8874-28b336bbcd40. PR: #11748 (draft, head0e5ea8cb).Verified against the diff: exactly one dead line removed from the
leadFeedexample (thetarget: 'acme_lead'spelling #10338 made unread onobject_operation), plus the token-ratchet ceiling LOWERED 6348 → 6342 to lock in the saving — the ratchet's own encouraged direction. The premise was re-verified at the source (endpoint.zod.ts:171now optional with the per-type describe; #11290's sweep leftskills/**untouched by declared surface, so this card was the genuine remainder). The conditional note was resolved the mechanically honest way: measured +16 tokens against a zero-headroom ceiling, gate red, so the mandatory half shipped alone — and the contract is still taught by the file's unchanged gate description at ~212-214, so nothing is lost but the dead demonstration. The decisive verification is structural: the example sits in anos:checkfence and type-checks withtargetabsent (257 prose examples green), which is direct evidence the vocabulary really made the key optional. Catalog sweep clean (only this file + an already-accurate evals README); 17 gate families green at the head with two initial build-precondition refusals correctly recorded as NOT MEASURED and re-run post-build; full-repo lint green; skip-changeset correct (nothing published moves).Clause-②: no (docs example, no accept/reject movement). Landing:
skills/**governed — PR stays draft, human merge. Queued for the maintainer's next merge pass alongside #11744.
Generated by Claude Code
Found while implementing #10338 (PR #11290), which made
ApiEndpoint.targetoptional in the vocabulary per the 2026-08-23 maintainer ruling:targetis now required at publish only fortype: 'flow'and is UNREAD fortype: 'object_operation'— the in-tree examples and protocol/getting-started docs were swept in that PR so the corpus stops teaching the dead key.Not swept there, out of that card's file surface AND a governed surface (human-merge only): the published skill still teaches the dead spelling.
skills/objectstack-api/SKILL.md(~line 181): theleadFeedexample writestarget: 'acme_lead'on atype: 'object_operation'endpoint. Nothing reads that key for this type, and nothing checks it againstobjectParams.object— the exact AI-authoring trap spec(api):ApiEndpoint.targetis required on every endpoint but read only fortype: 'flow'— anobject_operationauthor must write a value nothing consumes #10338 removed. The example still type-checks (check:skill-examplesgreen — optional accepts present), so no gate will flag it; the drift is prose-level only.target") is still accurate — only the example needs the key dropped plus a one-line "omittargeton object_operation" note if the skill's budget allows.Skill edits carry the maintainer's 2026-08-21 size-discipline ruling (whole-file and whole-package line readings in the PR body, minimal net growth) and land human-merge only (Prime Directive #14). Filed unassigned for triage.
Generated by Claude Code