Skip to content

docs(skills): teach one naming rule, every package-authored metadata name starts with its namespace - #30831

Merged
os-zhuang merged 3 commits into
mainfrom
claude/project-thread-i5fmg5
Nov 6, 2026
Merged

os-zhuang merged 3 commits into
mainfrom
claude/project-thread-i5fmg5

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Requested by Elon · project thread

Fixes #30805

Clause-②: no
Metadata-protocol: none

维护者速读

  • 改了什么:发布的 authoring skills 现在只教一条命名规则——包里写的每个元数据名都以包的 namespace 开头(crm_send_email、crm_sales_rep),例外只有字段、对象扩展、容器视图和翻译;全部示例和 evals 里的裸名已改成带前缀。
  • 为什么改:落实 [decision] A non-object metadata name shared by two installed packages often resolves to one package silently: which naming contract replaces ADR-0048 §3.4? #30798 裁决 C 的第二阶段,让 AI 在第三阶段把裸名变成拒收之前就已经按一种写法写名字。
  • 风险与回滚:只改 skills/** 文档和 evals,不动任何代码、schema 或行为;回滚就是还原这一个 PR。
  • 先看:skills/objectstack-platform/SKILL.md 第 123 行新加的规则段,以及下方的改名表和保留名单。
  • 两分钟验证:node scripts/check-skills-token-ratchet.mjs 全绿(每个文件都在原天花板内,靠同文件删减付费);pnpm --dir ui run check:skill-eval-tokens 通过。
  • 需要你做的:按 Tier H 走受治理审批;下方 Open questions 里有三处需要席位或你拍板的保留项(裸对象名、连接器 id、能力名)。

What changes

objectstack-platform/SKILL.md states the rule once, as a new paragraph right after the object rule:
every metadata name a package authors starts with its namespace (flows, actions, hooks, apps, pages,
dashboards, reports, datasets, queues, positions, permission sets, skills). The exceptions are fields,
object extensions and container views (derived from a prefixed object), and translations (the namespace,
an underscore, then the locale). The paragraph is taught as the authoring contract. It also says what
origin/main enforces today, read off the code:

  • defineStack refuses a bare object name (validateObjectNamespacePrefix, packages/spec/src/kernel/namespace-prefix.ts).
  • os build refuses a bare doc name (docs/namespace-prefix, an error).
  • os lint's naming/namespace-prefix warns only when one package declares an app, page, dashboard,
    flow, action, report or dataset name twice (packages/cli/src/commands/lint.ts around L280-330).

The old sentence in that paragraph said os lint warns on every bare UI or automation name whenever a
namespace is set. That is false on main, so it is removed. #30804 (open) widens that lint. If it lands
first, this paragraph's last sentence must be re-matched to its type list before merge. If this PR lands
first, #30804's PR owes that one-sentence update.

Every example and eval in skills/** that showed or generated a bare non-object name now carries the
prefix. Snippets with no manifest use crm. Snippets with their own package context keep it: todo for
the i18n app-todo mirror, which already uses todo_app. Cross-references move together: action targets,
dashboardName / reportName, approver and queue values, permissionSets, skills, action_ tool
names, translation keys and eval must_contain tokens.

skills/README.md "Conventions enforced across skills" now teaches the same rule. It keeps the existing
short-object-name convention for snippets, with no object-level namespace and no tableName.

Rename table (file → old → new)

File Old New
objectstack-platform/SKILL.md position legal_counsel, permission set contracts_editor crm_legal_counsel, crm_contracts_editor
objectstack-platform/evals/config-plugins-ops.json eval 1 expects "prefixed object names"; eval 9 queue support_intake (×3), position service_agent (×2) "prefixed object and flow names (crm_account, crm_convert_lead)"; crm_support_intake, crm_service_agent
objectstack-ui/rules/actions.md actions reassign_lead, convert_lead, create_campaign, print_a3, open_invoice_pdf (and its handler target); flow target lead_conversion; app segment /apps/crm/… crm_reassign_lead, crm_convert_lead, crm_create_campaign, crm_print_a3, crm_open_invoice_pdf; crm_lead_conversion; /apps/crm_enterprise/… (the app navigation.md declares)
objectstack-ui/rules/navigation.md dashboardName: 'sales_dashboard', reportName: 'opportunities_by_stage', page task_workbench crm_sales_dashboard, crm_opportunities_by_stage, crm_task_workbench
objectstack-ui/rules/pages.md pages invoice_print, release_notes crm_invoice_print, crm_release_notes
objectstack-ui/rules/dashboards.md dashboard sales_dashboard; datasets sales, opportunity_metrics (×3), order_metrics (×2), project_metrics, task_metrics (×2), employee_metrics, contract_metrics (×2); cube opportunity; actionUrl create_opportunity, export_dashboard_pdf; report pipeline_coverage_by_quarter each with crm_ (the cube's sql: 'opportunity' table stays)
objectstack-ui/evals/views-apps-actions-pages.json flow lead_conversion (evals 3, 8); key _actions.log_call (eval 11) crm_lead_conversion; _actions.crm_log_call
objectstack-ui/evals/report-period-export.json dataset opportunity_metrics (×2) crm_opportunity_metrics
objectstack-automation/SKILL.md assignment rule case_intake; queues escalations, support_intake (×2) crm_case_intake; crm_escalations, crm_support_intake
objectstack-automation/references/examples-flows.md flows escalate_overdue_cases, renewal_alert crm_escalate_overdue_cases, crm_renewal_alert
objectstack-automation/references/integration-recipes.md flow stripe_balance_sweep crm_stripe_balance_sweep
objectstack-automation/references/state-machines-and-approvals.md flows opportunity_discount_approval, dynamic_approval; positions sales_manager (×2, one in the org_membership_level counter-example), sales_director, manager, auditor each with crm_
objectstack-automation/evals/flows-triggers-approvals.json flows budget_approval (eval 3), convert_lead (eval 9); positions manager, finance_manager (×2); permission set contractor_portal; assignment rule case_intake; queues support_team, support_leads each with crm_
objectstack-automation/evals/approvals/test-revise-loop.md flow budget_approval crm_budget_approval
objectstack-ai/SKILL.md skill case_management; action escalate_case, tool action_escalate_case crm_case_management; crm_escalate_case, action_crm_escalate_case
objectstack-ai/evals/skills-tools-knowledge.json escalate_case / action_escalate_case (eval 1, must_contain too); close_case / action_close_case (evals 4, 5); agent support_bot (eval 5); eval 1 expects "a snake_case name" each with crm_; "a namespace-prefixed snake_case name"
objectstack-upgrade/references/examples-upgrade.md agent support_bot; skills: ['case_management'] crm_support_bot; ['crm_case_management']
objectstack-data/SKILL.md queue support_intake; position service_agent crm_support_intake; crm_service_agent
objectstack-data/rules/security.md permission set sales_user (×2); position sales_rep crm_sales_user; crm_sales_rep
objectstack-data/references/data-hooks.md hooks my_validation_hook, fill_position_on_hire, protect_strategic_accounts, audit_trail, cascade_account_updates, mask_pii, h crm_validation_hook, crm_fill_position_on_hire, crm_protect_strategic_accounts, crm_audit_trail, crm_cascade_account_updates, crm_mask_pii, crm_h
objectstack-data/references/examples-objects.md hook account_defaults crm_account_defaults
objectstack-data/rules/validation.md hook tax_id_external_check crm_tax_id_external_check
objectstack-data/evals/hooks-security-seeds-datasources.json queue inside_sales (×2), position inside_sales_rep (eval 8) crm_inside_sales, crm_inside_sales_rep
objectstack-i18n/SKILL.md _actions.complete (the app-todo mirror, namespace todo) _actions.todo_complete
objectstack-i18n/evals/bundles-locales-coverage.json action close (eval 1); report pipeline_by_stage, permission set sales_manager, position regional_lead, picklist deal_stage (eval 6); page home, flow expense_claim (eval 7) each with crm_
objectui/rules/protocol.md action "approve" "crm_approve"
skills/README.md "Short object names; no namespace, no tableName." the one rule plus its exemptions, then "Short object names in snippets; no object-level namespace, no tableName."

Not renamed, because they are exempt as nested names: validation rule names, flow node ids, edge targets,
widget ids, dataset dimensions and measures, assignment-rule entries, nav item ids, params, and container
view keys.

Held, not renamed (report per the dispatch's external-caller stop)

  • Connector ids stripe, github_mcp, warehouse_api, legacy_erp (integration-recipes.md),
    erp_api (datasources.md), sap_erp (upgrade eval 3) and the platform slack connector. The id is
    what credentials and inbound calls name.
  • The api flow carrier_callback. Its name is a segment of the inbound URL the carrier calls
    (…/hooks/carrier_callback/carrier).
  • The datasource warehouse. Its name keys the OS_DATASOURCE_WAREHOUSE_PASSWORD variable.
  • Capability names view_pii and expense.approve_request. Their grammar is dotted, and how a prefix
    applies to it is a phase-3 question.
  • Function handler names (normalize, helpdesk.aiTriageStub, billing.sync). They are not a
    metadata type. Knowledge source id support_kb. It is not stack metadata.
  • Bare object names in snippets (account, lead, task, …). These are outside this card, which
    covers non-object names. See Open questions.

Token ratchet: paid by same-file deletion, no ceiling moved

File Deleted Reading (tokens / ceiling)
objectstack-platform/SKILL.md the false os lint sentence; two TOC parentheticals that restate the H2 headings of plugin-development.md and operations.md 5990 / 6011
objectstack-ui/rules/actions.md "— an action can live in multiple surfaces" (restates "is an array") 2259 / 2259
objectstack-ui/rules/dashboards.md "the escape hatch escalates when the user wants the full surface" (restates the bullet's lead) 6252 / 6262
objectstack-ui/rules/navigation.md "Canonical rules:" (the heading already cites objectui ADR-0055) 2195 / 2196
objectstack-ui/rules/pages.md "hygiene, not uniqueness: two packages coexist on one bare name (ADR-0048 §3.4)". It contradicts the rule this PR teaches, and #30798's audit measured doc reads as first-match without a package. 5648 / 5669
objectstack-automation/SKILL.md "The third automation family:" (the heading names it) 6443 / 6449
objectstack-automation/references/state-machines-and-approvals.md the maxRevisions row's pointer, which the bullet list below repeats 5721 / 5730
objectstack-data/SKILL.md the seeds pointer's TOC parenthetical (it restates seeds.md's headings and was already missing one) 6087 / 6123
objectstack-data/references/data-hooks.md the afterFind code comment that repeats the sentence above it 10056 / 10066
objectstack-data/references/examples-objects.md the intro line that restates its "Lifecycle Hooks" heading 1741 / 1756
objectstack-data/rules/security.md the comment that repeats the defineStack({ permissions }) line under it 3688 / 3698
objectstack-data/rules/validation.md "— the typed, supported extension point" 2746 / 2756

Package-wide (all authored and eval files under skills/** this PR touches, ceil of bytes over 4):
7633 → 7635 lines, 97336 → 97353 tokens (+17). The +17 is the eval fixtures, which are measured but not
ratcheted, plus skills/README.md, which is outside the ratchet. Every ratcheted file is at or under its
ceiling.

Why

Decision #30798 ruled C (maintainer, verbatim: 「同意 c」). Every package-authored metadata name carries its
namespace, in three phases. This is phase 2, the AI-authoring half: the published skills teach the one rule
before phase 3 makes a bare name a refusal.

Tests

No code changes, so there are no new unit tests. The gates that read skills/** are what judge this diff.
Families derived by node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack
(48), run locally at head 7fd40067, each exit code recorded as COMMAND :: exit CODE:

  • 47 of 48 exit 0. They include node scripts/check-skills-token-ratchet.mjs (and --self-test),
    pnpm --filter @objectstack/spec run check:skill-examples (after the
    @objectstack/client-react... closure build), check:skill-docs, check:skill-refs,
    pnpm --filter @objectstack/lint run check:doc-formula-expressions (after the @objectstack/lint...
    closure build), pnpm check:skill-top-level-keys, check:skill-identifier-liveness,
    check:skill-frame-sync, check:skill-compatibility, check:nul-bytes, check:doc-authoring,
    check:pm-governed-merges and pnpm --dir ui exec vitest run scripts/.
  • pnpm check:dual-build-cjs-loads exited 3 with "PREREQUISITE NOT MET — this gate reads built output,
    and some package has no dist/". Nothing was measured. The gate reads packages/**/dist, which this diff
    does not touch. The PR's CI check-run is the reading for it.
  • --ran reconciliation: "48 derived famil(ies) accounted for — 47 run, 1 NOT-MEASURED (1 DERIVED from
    a recorded exit 3)", with 0 unrun.
  • Run outside the derived list: pnpm --dir ui run check:skill-eval-tokens --self-test and
    pnpm --dir ui run check:skill-eval-tokens exited 0 ("Every must_contain token is taught by its own
    skill bundle"). pnpm lint exited 0.

Acceptance notes

  • Out of scope, reported to the seat and not fixed here: skills/objectui/guides/project-setup.md
    L199-221 imports defineConfig from @objectstack/runtime, which exports no defineConfig on main.
    The snippet also nests objects under apps[] with the name my-app. It carries no os:check
    marker, so no gate compiles it.
  • Under the rule, an app named exactly crm is bare, because validateObjectNamespacePrefix checks
    for the namespace followed by an underscore. That is why the action URL now points at
    crm_enterprise.

Open questions

  1. Bare object names in skill snippets. Most snippets use short object names (account, lead) by
    the README convention, while ADR-0129 requires the prefix once a namespace is set. Recommendation: a
    separate card after phase 3, so this PR stays at the card's non-object scope.
  2. Connector, inbound api flow and datasource names (held above). Recommendation: keep them, and have
    phase 3 exempt names an external caller or a variable spells, or rename them with a migration note.
  3. Dotted capability names. Phase 3 should state how the prefix applies (crm.view_pii or
    crm_view_pii).

Verification

  1. Check out the branch and run node scripts/check-skills-token-ratchet.mjs. Every ratcheted file
    reads at or under its ceiling, and no ceiling moved.
  2. Run pnpm --dir ui run check:skill-eval-tokens. It passes, including the renamed
    action_crm_escalate_case token.
  3. Read skills/objectstack-platform/SKILL.md L123 against packages/spec/src/kernel/namespace-prefix.ts
    and packages/cli/src/commands/lint.ts. The enforcement sentence matches main.
  4. Run git grep -nE "name: '(lead_conversion|support_intake|sales_rep|escalate_case|case_management)'" -- skills.
    It returns nothing.

Human Minimum

  • 1. Schemas start as Zod; packages/spec holds no runtime logic. (packages/spec untouched.)
  • 2. Every name I added uses the casing for its kind.
  • 3. No formatter ran; pnpm lint passes.
  • 4. One issue, one branch off an up-to-date main, one pull request.
  • 5. A change that publishes carries a changeset, and both declaration lines are filled in here and in the changeset.
  • 6. packages/spec touched: its generated artifacts are regenerated and committed. (Not touched.)
  • 7. No hand edits to content/docs/references/, packages/*/CHANGELOG.md or content/docs/releases/.
  • 8. Title, body and comments are in English, apart from the fleet's required ## 维护者速读 summary.

🤖 Generated with Claude Code

https://claude.ai/code/session_016WV4cw4B24PbS5MZbX1r5j

…name starts with its namespace

State the rule once in objectstack-platform beside the object rule, with
the four exceptions (fields, object extensions, container views,
translations) and what main enforces today. Rename every bare non-object
name the skills' examples and evals show or generate to the crm_ prefix
(or the snippet's own package namespace), cross-references included.
Token ratchets are paid by same-file deletion of restatements.

Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016WV4cw4B24PbS5MZbX1r5j
@github-actions github-actions Bot added size/m documentation Improvements or additions to documentation tooling Fix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface labels Nov 6, 2026
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#1 · os-elon-musk · session_016WV4d1mkgEris4MHHLjtnk

Contract-review-claim: session_016WV4d1mkgEris4MHHLjtnk · head 7fd4006 · 2026-11-06T05:41Z

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#1 · os-elon-musk · session_016WV4d1mkgEris4MHHLjtnk

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 7fd40067c4cb1a376f2d314e0f3dc8ce952fbffd
Local-runs: probe — node scripts/check-skills-token-ratchet.mjs on a detached scratch worktree at head (ratchet readings; worktree removed after)
Scope: hits = the 27 skills/** files in the diff (governed rule text) + .changeset/30805-skills-namespace-prefix-every-name.md; cited = packages/spec/src/stack.zod.ts (L2539-2554, L6368-6375), packages/spec/src/kernel/namespace-prefix.ts (L28-44), packages/cli/src/commands/lint.ts (L228-256 PREFIXED_TYPES, L319-326), packages/cli/src/utils/collect-docs.ts (L812-819), packages/runtime/src/domains/automation-hooks.ts (L4, L14), packages/cli/src/commands/serve.ts (L5301), packages/runtime/src/datasource-env-credential.test.ts (L36, L97), scripts/check-skills-token-ratchet.mjs, examples/app-todo/src/translations/en.ts, decision #30798, card #30805, PR #30831 body, /mnt/project-files/skills-lane-seat1/dispatch-30805.md.

① Derived judgments

  1. Rule statement: correct. skills/objectstack-platform/SKILL.md L123 is one new paragraph directly after the object rule (L121): "every metadata name a package authors starts with its namespace", exceptions exactly fields, object extensions, container views, translations (NS_LOCALE). Matches [decision] A non-object metadata name shared by two installed packages often resolves to one package silently: which naming contract replaces ADR-0048 §3.4? #30798 option C and the ruling comment (2026-11-06T04:12Z). Taught as the contract, not as enforced.
  2. Enforcement sentence (L123 last sentence) matches main: stack.zod.ts L2539-2554 validateNamespacePrefix iterates config.objects only and defineStack throws at L6368-6375; collect-docs.ts L812-819 emits docs/namespace-prefix as severity: 'error'; lint.ts L228-256 PREFIXED_TYPES = apps, pages, dashboards, flows, actions (keyed objectName:name), reports, datasets, and L319-326 warns only on an intra-package duplicate. The false "warns on every bare UI/automation name" sentence on main L121 is removed. Bare-name phase 2: the namespace-prefix lint warns on every bare non-object name; first-party templates and examples adopt the prefix (ruling C on #30798) #30804 is still open (read 2026-11-06T05:46Z), so the sentence correctly reflects today's lint; the PR body records the re-match obligation if Bare-name phase 2: the namespace-prefix lint warns on every bare non-object name; first-party templates and examples adopt the prefix (ruling C on #30798) #30804 lands first.
  3. skills/README.md L98-103 restates the same rule with a pointer to the platform skill, keeps short object names as a snippet convention (L102-103). Consistent with the open-question hold on bare object names.
  4. Renames: grep of the head for all 58 old names in the diff returns one dangling reference (④ must-fix 1). All other cross-references move together: actions.md L60/L66 flow target crm_lead_conversion ↔ views-apps-actions-pages.json evals 3 and 8; actions.md L69 /apps/crm_enterprise/… ↔ navigation.md L8 name: 'crm_enterprise'; objectstack-ai/SKILL.md L97/L108 crm_case_management / action_crm_escalate_case ↔ skills-tools-knowledge.json eval 1 must_contain; examples-upgrade.md L113/L116; data/SKILL.md L412-414 queue/position ↔ config-plugins-ops.json eval 9 ↔ automation/SKILL.md L306-320; security.md L12 crm_sales_user ↔ L169-170 permissionSets: ['crm_sales_user']; dashboards.md datasets ↔ report-period-export.json eval 1; state-machines-and-approvals.md L75/L98/L114/L181/L311/L365 positions and flows.
  5. Holds (all read against code): carrier_callback (integration-recipes.md L116, L119) is :flowName in POST /automation/hooks/:flowName/:hookId (automation-hooks.ts L4, L14) — an inbound URL segment, dispatch says stop and report. warehouse (datasources.md L24, L58) keys OS_DATASOURCE_WAREHOUSE_PASSWORD (serve.ts L5301; runtime test L36/L97) — externally keyed. Connector ids stripe, github_mcp, warehouse_api, legacy_erp, erp_api, sap_erp, slack are connectorId references and credential keys, named in [decision] A non-object metadata name shared by two installed packages often resolves to one package silently: which naming contract replaces ADR-0048 §3.4? #30798's confidence-gap paragraph. Function handlers (normalize, helpdesk.aiTriageStub) and knowledge source id: 'support_kb' (ai/SKILL.md L245, an id on a non-stack record) are not top-level stack metadata names. Capabilities view_pii (security.md L240) and expense.approve_request (eval 7): the security catalog already has its own one-holder rule (ADR-0048 2026-10-08 addendum), and the prefix grammar for a dotted name is undefined; hold is justified as a phase-3 question, see ③.
  6. Completeness: grep of every name: '…' / "name": "…" literal and every backticked bare name by type word on the head finds no remaining bare top-level non-object name outside the declared holds. Remaining unprefixed name: literals are nested: page regions (pages.md L108-116), rule/variable/index/entry names, rowLevelSecurity[].name inside a permission set (security.md L145), objectui RoleDefinition (auth-permissions.md L156-157, a client-side @object-ui/types role, not stack metadata), showcase_* names (already prefixed). Bare objects (bootstrap.md L42 task, i18n objects.task) are the declared open question.
  7. Consistency: every CRM-shaped snippet uses crm; the i18n mirror uses todo (i18n/SKILL.md L92 todo_complete, L101 todo_app), and examples/app-todo/src/translations/en.ts carries no _actions block, so nothing diverges from the mirrored file.
  8. Paid deletions: each dropped sentence has another home or was false. data-hooks.md L410 comment ("fires for findOne too") lives at L36-37 and L46; state-machines-and-approvals.md L374 pointer lives at L386; pages.md "two packages coexist on one bare name (ADR-0048 §3.4)" was already false on main for docs (cross-owner docs/duplicate-name, collect-docs.ts header L29-51) and contradicts ruling C; security.md L17 comment restated the defineStack({ permissions }) line kept at L18; the two platform TOC parentheticals (L401, L405) restated H2 headings of the linked references; the remaining deletions (actions.md L5, dashboards.md L364-365, navigation.md L75, automation/SKILL.md L295, validation.md L251, examples-objects.md L114, data/SKILL.md L432) are restatements with no rule content.
  9. Ratchet (probe): 18 touched ratcheted files all within ceiling, no ceiling moved; readings match the PR body table (platform 5990/6011, actions 2259/2259, dashboards 6252/6262, navigation 2195/2196, pages 5648/5669, automation 6443/6449, data-hooks 10056/10066, examples-upgrade 1191/1197).

② Semver level

'@objectstack/skills': patch, docs/evals only; no packages/**, no schema. Clause-②: no re-derived: no published schema or exports surface touched. Metadata-protocol: none re-derived: no protocol change. PR body and changeset both carry the two lines. Consistent.

③ Boundary flags

④ Design judgment

  • skills/objectstack-platform/SKILL.md L121-123: holds. One rule beside the object rule, four exceptions, enforcement read off stack.zod.ts, collect-docs.ts, lint.ts. Minor: "declares a … name twice" is loose for actions, which collide only on the same objectName (lint.ts L243-250); should-fix 1: say "same objectName" if headroom (21 tokens) allows, not blocking.
  • skills/README.md L98-103: holds.
  • skills/objectstack-upgrade/references/examples-upgrade.md: must-fix 1: L73 (the "Open decisions" table row agent.tools → which skill | src/ai/support-bot.ts:12 | case_management · new skill | case_management) still names the skill case_management, while the same file's resolved snippet at L113-116 renames it to crm_case_management (skills: ['crm_case_management']). Dangling old-name reference in the same example; rename both cells (adds ~2 tokens, headroom is 6).
  • skills/objectstack-ui/rules/{actions,dashboards,navigation,pages}.md: hold; cross-references consistent (①4). dashboards.md L439 cube crm_opportunity with sql: 'opportunity' is correct (the table is the object, not a metadata name).
  • skills/objectstack-automation/**, skills/objectstack-data/**, skills/objectstack-ai/**, skills/objectstack-i18n/**, skills/objectui/rules/protocol.md: hold; renames, approver/queue values, translation keys and eval must_contain tokens move together.
  • Evals: prompts and expected outputs consistently renamed; config-plugins-ops.json eval 1 now expects "prefixed object and flow names", consistent with the rule.
  • Changeset: holds (patch, Before/Now, holds named).

Implemented-by: claude/project-thread-i5fmg5
Reviewed-by: session_016WV4d1mkgEris4MHHLjtnk

VERDICT: FAIL

… action lint wording

The objectstack-upgrade "Open decisions" row for `agent.tools` still named
the skill `case_management` in both cells while the example below it
declares `crm_case_management`; both cells now match. The platform rule's
enforcement sentence now says an action warns only when one package
declares its name twice on one object, which is how the lint keys actions.

Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016WV4cw4B24PbS5MZbX1r5j
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#1 · os-elon-musk · session_016WV4d1mkgEris4MHHLjtnk

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: b31889fc631363764677964823fa20391c9e7e07
Local-runs: probe — node scripts/check-skills-token-ratchet.mjs on a detached scratch worktree at head b31889f (ratchet readings for the two delta files; worktree removed after)
Scope: hits = the two delta files skills/objectstack-platform/SKILL.md L123 and skills/objectstack-upgrade/references/examples-upgrade.md L73, plus the full-head surface re-read (git diff origin/main...b31889fc: 28 files, +129/−115, all under skills/** plus one .changeset/); cited = packages/cli/src/commands/lint.ts L228-256 and L243-250 (from record 6677994085), scripts/check-skills-token-ratchet.mjs. Delta review on top of record 6677994085 (head 7fd4006, FAIL on one must-fix); prior findings ①1-9, ②, ③ and ④ stand by reference unless restated here.

① Derived judgments

  1. Delta is one commit b31889fc on 7fd4006 touching exactly 2 files, 2 insertions, 2 deletions; merge-base with origin/main unchanged at c17719dd; file surface still skills/** + one changeset, no packages/**, content/docs/** or docs/adr/**.
  2. Must-fix 1 (record 6677994085 ④) resolved: examples-upgrade.md L73 now reads crm_case_management · new skill | crm_case_management in both cells, matching the resolved snippet at L116 skills: ['crm_case_management']. git grep of head b31889f over skills/** for case_management not preceded by crm_ returns nothing.
  3. Should-fix 1 taken: SKILL.md L123 last sentence now reads "warns only when one package declares an app, page, dashboard, flow, report or dataset name twice, or an action name twice on one object". This matches lint.ts PREFIXED_TYPES (apps, pages, dashboards, flows, actions, reports, datasets; L228-256) and the action registry key objectName:name with the object-less fallback (L243-250): two same-named actions collide only when they share one objectName or both omit it. The wording "on one object" is accurate for the declared-object case; the object-less pair also collides (both fall to the global key), which "on one object" covers loosely but does not contradict. No enforcement claim beyond main.
  4. Rule paragraph otherwise unchanged from the reviewed version: one rule beside the object rule (L121), exactly four exceptions (fields, object extensions, container views, translations NS_LOCALE), still taught as the authoring contract.
  5. Ratchet (probe at b31889f): skills/objectstack-platform/SKILL.md 5998 / 6011 (headroom 13, was 21); skills/objectstack-upgrade/references/examples-upgrade.md 1193 / 1197 (headroom 4, was 6). Both within ceiling, no ceiling moved; gate reports 57 authored files within ceilings.
  6. No new renames, holds or deletions in the delta; completeness and consistency judgments from record 6677994085 ①4-8 are unaffected.

② Semver level

Unchanged: '@objectstack/skills': patch; Clause-②: no and Metadata-protocol: none still hold (prose and evals only, no published schema, no protocol change). PR body and changeset carry both lines.

③ Boundary flags

④ Design judgment

Implemented-by: claude/project-thread-i5fmg5
Reviewed-by: session_016WV4d1mkgEris4MHHLjtnk

VERDICT: PASS

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#1 · os-elon-musk · session_016WV4d1mkgEris4MHHLjtnk

维护者速读

席位核对 — ACCEPT · head b31889f


Generated by Claude Code

@objectstack-fleet objectstack-fleet Bot added the pm:awaiting-merge PR only: landing waits on the maintainer's own review and merge (SKILL.md 复核 ②); never on an issue label Nov 6, 2026
@os-zhuang
os-zhuang marked this pull request as ready for review November 6, 2026 08:04
@os-zhuang
os-zhuang added this pull request to the merge queue Nov 6, 2026
Merged via the queue into main with commit 0e73de8 Nov 6, 2026
62 checks passed
@os-zhuang
os-zhuang deleted the claude/project-thread-i5fmg5 branch November 6, 2026 08:18
@objectstack-fleet objectstack-fleet Bot removed the pm:awaiting-merge PR only: landing waits on the maintainer's own review and merge (SKILL.md 复核 ②); never on an issue label Nov 6, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/m tooling Fix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Bare-name phase 2: the published authoring skills teach one rule, every metadata name carries the namespace (ruling C on #30798)

3 participants