Maintainer-requested, 2026-09-04, verbatim: 「原则应该写入 本项目agent 记忆。哪些应该在元数据应用中开发,哪些应该完善平台能力。」 and 「包括评估是否应该更新objectstac官方skills」.
Why now
The boundary has been decided ad hoc, several times, by different seats, on the same day — and each time from scratch. Three worked rulings from 2026-09-04, all with measurements behind them:
Nothing in AGENTS.md, CLAUDE.md or skills/** states the rule. So every seat re-derives it, and the re-derivations differ.
The rule to write down
Not new policy — the rule those three rulings already followed, stated once so it stops being re-derived.
The question that decides it: could this be written by something that has only the metadata, and no knowledge of this company?
|
belongs in |
examples measured on hotcrm |
| No — it encodes a company's own judgement |
the metadata app |
a discount ceiling, who a case is assigned to, how won/lost is booked; the company's own objects, views, flows |
| Yes — it only asks whether the metadata is self-consistent |
the platform |
reference integrity, translation coverage, view rosters, sharing-rule coverage, CRUD round-trips, RLS probes per declared position |
| the subject is platform behaviour, the cost lands on the app |
the platform, and it is a gap until it does |
asserting what a hook does inside the platform's own sandbox (#15325) |
Second question, for a capability an app wants published: if a second app needed this, would it copy the implementation? Yes ⇒ platform. That is the #15261 test, and it is why one consumer defers rather than publishes: one consumer is a use, two is a contract.
Two anti-patterns, both measured today, both worth naming
Where it goes
1. AGENTS.md. The source of truth this repo's agents read.
⚠️ Two hazards, both real:
2. CLAUDE.md gets the condensed mirror only if the rule meets that file's own stated bar ("the rules that must never be missed, because missing one wastes or corrupts other agents' work"). Argue it either way — ⛔ do not assume it qualifies.
3. The published skills/ — evaluate, do not assume. There are 11 published skills (objectstack-ai, api, automation, data, formula, i18n, platform, pm-dispatch, query, ui, upgrade). This rule is aimed at someone building an app on the platform, which is exactly that audience.
Read them and answer, with reasons:
- Does one of them already own this question?
objectstack-platform and objectstack-upgrade are the obvious candidates by name — check, don't assume.
- Is the app-facing half ("before you hand-write it, ask whether the platform should derive it") a fit for a published skill, or is it internal contributor guidance that would just be noise to a customer?
- ⛔ If the answer is "no published skill should carry this", say so and why — that is a perfectly good outcome and better than a paragraph nobody reads.
Acceptance
- The rule stated once, in prose an agent can apply without a worked example — the deciding question, the second question for publication, and the two anti-patterns.
- Every claim traceable: cite the ruling or the measurement, ⛔ never "as a rule we prefer…".
check:pm-skill-ratchet green, with the line count read out.
- A stated verdict on
CLAUDE.md and on each candidate published skill, including the "no" verdicts.
- ⛔ No other edits to
AGENTS.md. ⛔ Do not tidy neighbouring sections.
⛔ Not in this card
⛔ Do not change any code, any test, or os verify. ⛔ Do not act on #15418's audit — it is running in parallel and its numbers are its own deliverable. This card writes the rule; that card measures the debt.
Maintainer-requested, 2026-09-04, verbatim: 「原则应该写入 本项目agent 记忆。哪些应该在元数据应用中开发,哪些应该完善平台能力。」 and 「包括评估是否应该更新objectstac官方skills」.
Why now
The boundary has been decided ad hoc, several times, by different seats, on the same day — and each time from scratch. Three worked rulings from 2026-09-04, all with measurements behind them:
packages[]path (#15005) #15261 — a new module was needed by four call sites inside one package. Ruled: do not publish it from@objectstack/core; keep it package-private and decide its home when a second consumer appears.@objectstack/clisubpaths but ratifies only./console—extractHookBody(and./package.json) have no public entry, and an app's hook-body fidelity harness breaks with no replacement #15325 — an app needs the platform's hook-body lowering pass to test what actually ships; 17.3.0 sealed the subpath. Half the need turned out to be already anoscommand (os build --strict-body, which turns "bundled instead of lowered" into exit 1). The card had asserted anos lintrule that does not exist anywhere in the tree.os verifyshould have derived #15418 (open) — hotcrm carries 69,419 lines of hand-written test against a 39,734-line metadata app, and a first pass suggests a large share of it asserts only that the metadata is self-consistent — work a platform can derive.Nothing in
AGENTS.md,CLAUDE.mdorskills/**states the rule. So every seat re-derives it, and the re-derivations differ.The rule to write down
Not new policy — the rule those three rulings already followed, stated once so it stops being re-derived.
The question that decides it: could this be written by something that has only the metadata, and no knowledge of this company?
Second question, for a capability an app wants published: if a second app needed this, would it copy the implementation? Yes ⇒ platform. That is the #15261 test, and it is why one consumer defers rather than publishes: one consumer is a use, two is a contract.
Two anti-patterns, both measured today, both worth naming
@objectstack/clisubpaths but ratifies only./console—extractHookBody(and./package.json) have no public entry, and an app's hook-body fidelity harness breaks with no replacement #15325's harness header states exactly this and refuses to take that route; finding — a gating lint rule shipped claiming "0 findings over the corpus" and names an object that fires it; the corpus copy is not the real app #15357 is the same shape one level up, where a rule shipped claiming "0 findings over the corpus" against a corpus that was not the app it named.os verifyon a multi-package app derived zero cases and reported success (record — the option-B reader by-shape sweep: method, derived 37-key collection set, triaged false positives, and the two packages it found #15210). An app that meets that writes its own — and never comes back. So the order is fixed: make the derived half trustworthy first, then take the hand-written half back. Reversing it just deletes protection.Where it goes
1.
AGENTS.md. The source of truth this repo's agents read.AGENTS.mdis a governed surface (§522). ⛔ Auto-merge is never armed on it; it lands by human review.check:pm-skill-ratchetline ceiling, last re-anchored at 1162 lines by PR docs(agents): a PM-dispatched card arrives already assigned — claim comments, not the assignee field, say who owns it (#15287) #15290. Measure the ceiling before writing and make the addition fit — reflow the section you add to rather than pushing the file over. ⛔ Do not raise the ceiling to make room.AGENTS.mdandCLAUDE.md. Branch frommain, keep the addition in its own section away from docs(agents): a PM-dispatched card arrives already assigned — claim comments, not the assignee field, say who owns it (#15287) #15290's claim paragraph, and checkgit merge-tree --write-tree --name-only origin/main <your head>before you report — a silent conflict on this file cost five hours today on a different PR.2.
CLAUDE.mdgets the condensed mirror only if the rule meets that file's own stated bar ("the rules that must never be missed, because missing one wastes or corrupts other agents' work"). Argue it either way — ⛔ do not assume it qualifies.3. The published
skills/— evaluate, do not assume. There are 11 published skills (objectstack-ai,api,automation,data,formula,i18n,platform,pm-dispatch,query,ui,upgrade). This rule is aimed at someone building an app on the platform, which is exactly that audience.Read them and answer, with reasons:
objectstack-platformandobjectstack-upgradeare the obvious candidates by name — check, don't assume.Acceptance
check:pm-skill-ratchetgreen, with the line count read out.CLAUDE.mdand on each candidate published skill, including the "no" verdicts.AGENTS.md. ⛔ Do not tidy neighbouring sections.⛔ Not in this card
⛔ Do not change any code, any test, or
os verify. ⛔ Do not act on #15418's audit — it is running in parallel and its numbers are its own deliverable. This card writes the rule; that card measures the debt.