Skip to content

Skills optimization flight — skills/objectstack-ai: RESTRUCTURE (≈ −2,300 tok, −29%) — 26% of the file teaches the agent surface it forbids its readers, the flagship defineSkill example declares four tools that resolve to nothing, and the open-edition MCP path (the only AI path without a cloud licence) is taught nowhere #14305

Description

@os-litant

Member card of the skills catalog optimization program #14292 (maintainer mandate 2026-09-02, verbatim: 「审核所有的 skills,进行全面的优化。」). Filed by the skills lane seat (session session_01LraLgQVGq8egUwfYZpbYt1). Read-only audit at objectstack origin/main a59f78d. Full findings table = audit record: the dev posts audit/objectstack-ai/findings.md (seat scratchpad) verbatim as the first comment at claim time.

Audit summary

SKILL.md 592 lines / 6,791 tok (headroom 15) · evals/README.md 315 (headroom 0) · generated _index.md 819 — package 7,925. Real usage: zero *.skill.ts / *.tool.ts / *.agent.ts files in examples or apps; only 3 patterns have real usage — action.ai.exposed + ai.description (7 usages), the MCP action bridge (examples/app-todo/test/mcp-actions.e2e.ts + all of packages/mcp), and app.defaultAgent (1). Model registry, conversations, MCPServerRef/MCPToolBinding have zero consumers outside packages/spec. The "agents are platform-internal" boundary still holds (os g agent retired with a prescription; agent.tools/agent.knowledge are retiredKey() tombstones) — yet the package spends 1,777 tokens (26%) teaching that closed surface. Verdict RESTRUCTURE: weight inverted against usage; defineTool (0 usages, no runtime reader until ADR-0109 lands) gets a full section while action.ai (7 usages) gets 371 tokens near the bottom; the description promises three surfaces the body never teaches.

Top findings

id span proposal Δtok
AI-B-02 SKILL.md:145-215 DELETE agent Required/Optional/Example (section opens "third parties do not author agents"); keep 2 retirement rows −600
AI-C-01 :28-36,83-86,89-90,126-131,330-335,339-342,360,364-365 MERGE-INTO :28-36 — "runtime is cloud/EE, open = MCP" restated 8× = 715 tok; replace 7 with a marker −350
AI-F-04 :289-335,552-565 *.tool.ts → a note row; ADR-0109: "no runtime reader until that lands" (stack.zod.ts:594-601) −230
AI-D-03 :495-521 DELETE §Structured Output — agent-only field the file itself calls "declared only" −217
AI-H-01 evals/README.md:1-44 planned-eval stub, lists 5 files that don't exist (DEFERRED, #14296 item 2) −195
AI-D-07 :362-381 REWRITE-AS-CONSTRUCT — HITL narration; every symbol cloud-closed −165
AI-D-05 :442-456 MERGE-INTO :409-413 table — 5 items restating keys from 30 lines above −150
AI-A-02 :475-491 REWRITE-AS-CONSTRUCT — "Model Selection"/"Temperature" taste tables; the enforced fact (temperature min 0 max 2, agent.zod.ts:38) is missing −140
AI-B-01 :40-50 DELETE "When to Use" −125
AI-D-01 :63-73 DELETE "Why Three Tiers?" analogy table + a false best-practice blockquote −124
AI-D-04 :461-473 DELETE vendor model catalogue; keep the enum blockquote −110
AI-D-06 :526-529,541-544 DELETE pitfalls 1/2/4 — generic prompt advice the frontmatter disclaims −99
AI-C-02 :138-141 DELETE ops callout — ai_usage_daily has no open-repo object −62
AI-E-01 :251-275 REWRITE — the flagship defineSkill example declares tools: ['query_support_case', …]; none is in PLATFORM_PROVIDED_TOOL_NAMES or stack.tools[] or action_* — exactly the failure ai-skill-tool-unresolved (packages/lint/src/validate-ai-tool-references.ts:150-171) exists to catch; the package's own defineTool example defines create_case, so the two examples don't compose 0
AI-B-03 :20-218 reorder — first customer-authorable section starts at line 218 0

Net ≈ −2,303 of 7,925 (29%) after +312 of paid additions.

Incidental falsehoods (fix in this flight)

  1. SKILL.md:71-73 — "Direct tool assignment to agents is supported but considered legacy." FALSE: agent.tools is a retiredKey() tombstone → parse error (agent.zod.ts:234-236); the same file says so at :168. HIGH.
  2. SKILL.md:579-580 — "any CEL predicate (e.g. a tool's availability condition)". FALSE: ToolSchema carries no CEL expression (tool.zod.ts:132-168); the only AI CEL carriers are ai/model-registry promptTemplate.system/.user. The same wrong premise sits in skills/README.md:104-105 ("AI tool params") — record it under "follow-up for skills/README.md". HIGH.
  3. Residue (code fact, not a doc edit): SKILL.md:96-98 says metadata_assistant is "not vocabulary" while packages/platform-objects/src/apps/studio.app.ts:50 pins defaultAgent: 'metadata_assistant' — file as an out-of-scope card.

Three funded additions

  1. Open-edition MCP wiring (+180, paid by AI-D-03): MCPServerPlugin / MCPServerRuntime from @objectstack/mcp, the /api/v1/mcp endpoint, the tool names a client sees (list_actions, run_action, query_records, describe_object).
  2. skill.tools[] resolution ladder + the platform tool registry (+0, paid by AI-B-02): the ADR-0109 default path and the ~30 real names in packages/spec/src/system/constants/platform-tool-names.ts:38-80.
  3. Trigger-condition operator↔value shape column (+30, paid by AI-D-01 + AI-B-01): in/not_in → array, eq/neq → string, contains → either (skill.zod.ts:37-50,130-175).

Flight scope

IMPLEMENT (same-file, shrink-only): all rows above and in the findings file at HIGH or MED; the three funded additions; falsehoods 1–2; AI-E-01 rewrite so the flagship example resolves; AI-A-01 description edit (stop promising conversations / model registry / MCP integrations the body does not teach, or teach MCP via addition 1).

ANCHOR RULINGS: MCP server / plugin wiring → this package teaches the open-edition path; objectstack-platform keeps plugin mechanics. Formula/CEL → objectstack-formula (delete the false CEL claim).

DEFER: AI-H-01 (eval stub, #14296 item 2); AI-B-04 (generator map vs body mismatch — out-of-scope card for the spec lane's build-skill-references.ts SKILL_MAP).

Flight constraints (binding)

  • ONE draft PR, first line Fixes #<this card>; governed ⇒ stays draft; review requests are the seat's step.
  • Token ratchet: no ratcheted file may grow; additions paid by deletions in the SAME file; ⛔ re-wrap is not payment; ⛔ no ceiling raise; ⛔ no new files; ⛔ do not touch the ratchet script.
  • ⛔ Never edit another package's files or skills/README.md prose; follow-ups go in the PR body. Generated files untouched. Regenerate the README index only if a drift gate requires it (report which).
  • Live surface with zero measured usage ⇒ one row pointing at its schema; retired/tombstoned ⇒ delete. A false claim matching a spec .describe() string ⇒ spec-side twin card.
  • Gates: node scripts/check-skills-token-ratchet.mjs, pnpm --filter @objectstack/spec check:skill-examples, pnpm check:skill-compatibility, pnpm check:skill-identifier-liveness, plus node scripts/pm/dispatch-gates.mjs --commands <changed paths>; record the head sha.
  • PR body: per-item 落点 | before | after keyed by finding id; per-file token delta; needs:contract-review on both carriers (falsehood 1 and the trigger-operator column are contract-semantics claims).

Refs: #14292 · #14296 · #13658.

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions