You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit 595621d
Browse filesBrowse the repository at this point in the historyBrowse files
docs(skills): split the four over-500-line SKILL.md into routing + references, TOC the seven long reference files, trim data's description (#19738)
Fixes#19715
Clause-②: no
## 维护者速读(草稿)
**改了什么** — 四个超过 500 行的已发布 `SKILL.md`(platform 1223 → 487 · automation
961 → 448 · data 854 → 469 · upgrade 600 →
488)按标题边界切分:每个被移走的段落与代码块**逐字节**落到该技能自己的 `references/` 下(新增 9
个参考文件),原位只留一行指针;七个超过 300 行的参考文件顶部各加 5 行目录(锚到已有标题);`objectstack-data` 的
`description` 压到 689 字符,触发短语与排除句原样保留、只删括号枚举。零删内容:20 个移动块中 17 个字节相同,3
个仅改了 10 处相对链接路径(逐条列在下文)。
**为什么改** — 决策批次 #213 第 1 项,维护者裁决「1 2 4 同意」:超长 SKILL.md 会被 `head`
预读截断,示例与运维尾段读起来像第二个技能;切成「路由 + 规则」后入口文件只装规则、决策表与指针,长示例按需跟指针再读。
**风险与代价(含回滚)** — ① 直接读 `SKILL.md` 单文件时,105 个 eval 断言词里有 18 个(从 103 降到
85)现在只经指针可达;整棵技能树(SKILL.md + rules + references)的读数 105/105
前后不变,方法与局限见下文。② 为了到 500 行,platform 的第二部分(插件开发)与 automation
的「状态机与审批」整段下沉,其中含少量决策表——它们仍在树里,入口页保留指向 `rules/*.md` 的路由行。③
三个门禁脚本的数据行跟着文本走(token 天花板行、role-word 基线两行搬家、scaffold 政策的载体路径),没有新增门禁。④
令牌总量 +2058(指针行 + 目录行),四个入口行已按落地值下锁,七个目录文件中 4 行按裁决上调、3 行有余量按落地值下锁。回滚:整个
PR 一次 revert 即可,没有生成物或状态迁移。
**席位意见** — **建议批准并合并,但先看一眼「Sections that left SKILL.md」。**
裁决的八条形状逐条核过:零删内容(20 个移动块 17 个字节相同、3 个只改了 8 处相对链接;席位另做了四个技能的整行多重集比对,除链接与
description 外没有任何一行离开树)、四个入口文件全部 ≤ 500、data 的 description 689
字且触发短语与排除句原文保留、七个长参考文件各 5 行目录且锚点全部可达、净 +77 ≤ +80、无新门禁、changeset 按 #19721
惯例。evals 读数按机械法前后树列 105 / 105 不变;入口页单读 103 → 85,离开的 18 个词都在指针可达处 ——
这是切分的代价,不是丢失。token 棘轮四行入口下锁、九个新文件零余量钉住、四行目录文件按裁决引文上调。第 0 轮 CI 红是本 PR
的:`packages/rest` 的仓级测试钉住 automation 入口页必须写出状态内省路由,切分把唯一拼写搬走了;第 1
轮把拼写放回指针行(净 0 行,不改测试),席位在补丁头上重跑该测试 8 / 8 绿。留给你的一个判断:为了到 500 行,platform
的插件开发与运维两大部分、automation 的状态机与审批、data 的 seeds / 字段组 / lint 整段下沉,其中含少量决策表
—— 它们仍在树里、入口页留有路由行;如认为某段必须留在入口页,点名即可,dev 按行预算换一段下沉。复核记录:PR 评论
5786766593(PASS,在席按服务档渲染);ACCEPT 在卡 #19715。CI 读数:32 latest-per-name
check runs — 25 success, 7 skipped, 0 in progress, 0 other。
**你要做的** — 这是 Tier H(`skills/**`)受管面:确认「哪些规则段可以离开入口页」符合你的意图(见「Sections
that left SKILL.md」),然后手工合并;如认为某段必须留在入口页,请点名,我按行预算再换一段下沉。
---
## What this does
The four published `SKILL.md` files over 500 lines are split at heading
boundaries into routing + rules. Every moved paragraph and code block
lands **verbatim** under that skill's `references/` (nine new files)
with a one-line pointer left where it was; the seven reference files
over 300 lines gain a 5-line table of contents anchored to their
existing headings; `objectstack-data`'s `description` shrinks to 689
characters with the same trigger phrases and exclusion sentence. The
token ratchet re-locks the four entry rows at their landed counts, pins
the nine new files at theirs, and raises the four TOC'd rows that
carried no headroom by exactly the added tokens under the ruling.
`skills/README.md` and `content/docs/ai/skills-reference.mdx` are
regenerated from the trimmed frontmatter by `gen:skill-docs`.
Premise re-measured on `origin/main` `106d4c8dd` before editing: the
four line counts (1223 · 961 · 854 · 600) hold; the seven files carried
no TOC; data's `description` measured **1003** characters by a YAML
folded-scalar parse (the card's 1,023 was a different counting; either
way it sat against the 1,024 cap). `premise_still_valid: true`.
## Readings after (head `011dfd603`)
| File | Before | After |
|:--|--:|--:|
| `skills/objectstack-platform/SKILL.md` | 1223 | **487** |
| `skills/objectstack-automation/SKILL.md` | 961 | **448** |
| `skills/objectstack-data/SKILL.md` | 854 | **469** |
| `skills/objectstack-upgrade/SKILL.md` | 600 | **488** |
| data `description` (YAML folded, trailing newline excluded) | 1003
chars | **689 chars** |
| net lines across `skills/**` (tracked +77 / −1781, new files +1781) |
— | **+77** (budget ≤ +80) |
## Diff proof — every moved block (source lines at `106d4c8dd` →
destination), verified byte-for-byte against the base blob
| # | Source (lines, count) | Heading(s) | Destination (lines) | Bytes |
|:-:|:--|:--|:--|:--|
| 1 | platform `SKILL.md` 39–68 (30) | `### Minimal Example` |
`references/bootstrap.md` 3–32 | verbatim |
| 2 | platform 116–157 (42) | `### Map Format (Key → Name)` · `###
Barrel Import Pattern` | `references/bootstrap.md` 34–75 | verbatim |
| 3 | platform 272–280 (9) | `### Scaffolding Command` |
`references/bootstrap.md` 77–85 | verbatim |
| 4 | platform 498–527 (30) | `### Plugin Loading Order Matters` · `###
Programmatic Bootstrap (Without CLI)` | `references/bootstrap.md` 87–116
| verbatim |
| 5 | platform 531–542 (12) | `## Multi-App Composition` |
`references/bootstrap.md` 118–129 | verbatim |
| 6 | platform 585–644 (60) | `## Complete Working Example` |
`references/bootstrap.md` 131–190 | verbatim |
| 7 | platform 649–1007 (359) | `# Part 2 — Plugin Development & Kernel
Extension` (whole) | `references/plugin-development.md` 1–359 | 6 link
paths re-pathed, else verbatim |
| 8 | platform 1012–1213 (202) | `# Part 3 — Operations: CLI, Testing,
Deployment` (whole) | `references/operations.md` 1–202 | verbatim |
| 9 | automation 143–209 (67) | `### Flow Example — Auto-Escalate
Overdue Cases` | `references/examples-flows.md` 3–69 | verbatim |
| 10 | automation 378–760 (383) | `## State Machines & Approvals`
(whole) | `references/state-machines-and-approvals.md` 1–383 | verbatim
|
| 11 | automation 851–916 (66) | `### Time-relative triggers — scheduled
per-record date sweep` | `references/examples-flows.md` 71–136 |
verbatim |
| 12 | data 184–230 (47) | `## Field Groups (MVP)` |
`references/examples-objects.md` 3–49 | verbatim |
| 13 | data 300–359 (60) | `## Quick-Start Template` |
`references/examples-objects.md` 51–110 | 1 link path re-pathed |
| 14 | data 499–525 (27) | `### Lifecycle Hooks` |
`references/examples-objects.md` 112–138 | 1 link path re-pathed |
| 15 | data 565–622 (58) | `## Metadata Protection (\`protection\`)` |
`references/examples-objects.md` 140–197 | verbatim |
| 16 | data 626–767 (142) | `## Seed Data & Fixtures (\`defineSeed()\`)`
(whole) | `references/seeds.md` 1–142 | verbatim |
| 17 | data 771–823 (53) | `## Linting & Generation Quality` |
`references/lint-rules.md` 1–53 | verbatim |
| 18 | upgrade 269–301 (33) | `### 2.3 A worked R1 — the retired
field-mapping \`transform\`` | `references/examples-upgrade.md` 3–35 |
verbatim |
| 19 | upgrade 449–496 (48) | `### 3.4 The report — the human half` |
`references/examples-upgrade.md` 37–84 | verbatim |
| 20 | upgrade 540–573 (34) | `## The v17-canonical shapes, compiled` |
`references/examples-upgrade.md` 86–119 | verbatim |
Method: for each row the base bytes (`git show 106d4c8:path`, the
listed lines) were hashed against the destination's listed lines — 17
rows identical, 3 rows differ only on the link-path lines below. The
upgrade `a`-tag anchors (`decide-alone-or-ask`, `reverse-check`) stayed
in `SKILL.md` because they sit just outside the moved ranges. The four
new multi-block files carry a one-line H1; the five single-block files
begin with the moved heading itself.
**The only non-verbatim bytes — 10 link-path retargets** (a relative
link crossing a move boundary would otherwise dangle):
- platform `SKILL.md` (staying text): `#verify-your-work`,
`#ports--networking`, `#part-3--operations-cli-testing-deployment` →
`./references/operations.md#…` (3)
- `references/plugin-development.md` (moved text, lines
656/657/658/738/760/791 at base): `./rules/plugin-lifecycle.md` →
`../rules/…` (2), `./rules/service-registry.md` → `../rules/…` (2),
`./references/plugin-hooks.md` → `./plugin-hooks.md` (2),
`../objectstack-data/SKILL.md` → `../../objectstack-data/SKILL.md` (1)
- data `SKILL.md` (staying text): `#field-groups-mvp` →
`./references/examples-objects.md#field-groups-mvp` (1)
- `references/examples-objects.md` (moved text, base lines 359 and 523):
`./rules/indexing.md` → `../rules/indexing.md` (1),
`./references/data-hooks.md` → `./data-hooks.md` (1)
Every intra-file anchor in the 15 touched markdown files resolves
(github-slugger, the repo's slug authority; 100 anchors, 0 unresolved)
and all 104 relative links under `skills/**` resolve to existing files
(the two `./crm_index.md` / `./crm_user_guide.md` spellings in
`objectstack-ui/rules/pages.md` are illustrative example text on the
base, untouched).
## Sections that left SKILL.md, and why the route had to widen
The card's route (platform's ops tail + the two 60-line complete
examples) reaches 894 lines on platform — the fenced code in the four
files totals 462 / 310 / 223 / 162 lines against the 723 / 461 / 354 /
100 that had to go, so examples alone cannot reach 500 on three of the
four. The cut therefore also moves whole self-contained parts: platform
Part 2 (plugin development, which already has its own `rules/*.md` and
`references/plugin-hooks.md` — the entry keeps a routing line to them),
automation's State Machines & Approvals, data's Seed Data & Fixtures,
Field Groups and Linting. Decision tables that now live behind a
pointer: platform's ObjectKernel vs LiteKernel, Plugin Loading Order,
Well-Known Plugin Names, MetadataPlugin boundary, Feature Flags, the ops
tables; automation's Approver Types, Node Config, Branching, Best
Practices and the state-machine rule; data's seed tables and the
lint-rule table. Every pointer names the destination and the moved
headings (heading names only — no paraphrase). If the maintainer wants a
named section back in the entry, it costs its line count against the 500
ceiling; say which and I swap.
## Evals reading (card item 5) — method, before / after, limit
There is no executable runner in this repo: the fixtures
`skills/*/evals/*.json` are read by
`scripts/check-skills-token-ratchet.mjs` for pricing only (no script
consumes `must_contain`). The reading is therefore the mechanical one
the dispatch names: for every eval of the four skills, each
`must_contain` term's presence (substring, case as written) in that
skill's `SKILL.md` alone and in the skill tree (`SKILL.md` + `rules/**`
+ `references/**`), on `106d4c8dd` and on this head. Script:
`eval-reading.mjs` (in the scratchpad, not committed).
| Skill | SKILL.md alone, before | SKILL.md alone, after | Tree, before
| Tree, after |
|:--|--:|--:|--:|--:|
| objectstack-platform | 24/24 | 18/24 | 24/24 | 24/24 |
| objectstack-automation | 26/26 | 20/26 | 26/26 | 26/26 |
| objectstack-data | 35/37 | 31/37 | 37/37 | 37/37 |
| objectstack-upgrade | 18/18 | 16/18 | 18/18 | 18/18 |
| **total** | **103/105** | **85/105** | **105/105** | **105/105** |
The tree column — the reading of record for a skill whose entry routes
to references — is unchanged for all 105 terms. The 18 terms that left
`SKILL.md` alone, each with the pointer on the eval prompt's path (the
two data terms already absent on the base, `schemaMode` and `type:
'secret'`, live in `rules/datasources.md` and `rules/security.md` and
are untouched):
| Eval | Term | Now in | Pointer in SKILL.md |
|:--|:--|:--|:--|
| platform #2 (audit plugin) | `registerService`, `ctx.hook(`,
`metadata:reloaded`, `init(`, `destroy` |
`references/plugin-development.md` (+ `rules/plugin-lifecycle.md`,
`references/plugin-hooks.md`) | the Part 2 pointer, which also names
`rules/plugin-lifecycle.md` · `rules/service-registry.md` ·
`references/plugin-hooks.md` |
| platform #6 (production deploy) | `OS_TRUSTED_ORIGINS` |
`references/operations.md` | the Part 3 pointer (names Ports &
networking · Deployment targets) |
| automation #1 (nightly sweep) | `defineFlow`, `type: 'schedule'` |
`references/examples-flows.md` | the Flow Example pointer; the Flow
Types table row `schedule` stays in the entry |
| automation #3 (approval + revise) | `type: 'approval'`, `type:
'back'`, `maxRevisions` | `references/state-machines-and-approvals.md` |
the State Machines & Approvals pointer (names Send-back for revision ·
Node Config); `approval_revise` and `revise` stay in the entry |
| automation #5 (function step) | `timeoutMs` |
`references/examples-flows.md` | the Flow Example pointer |
| data #4 (seeds) | `env:`, `daysFromNow` | `references/seeds.md` | the
Seed Data pointer (names Dynamic values (CEL)); `defineSeed`,
`externalId`, `upsert` stay in the entry |
| data #2 (invoice lines) | `deleteBehavior`, `inlineEdit` |
`rules/relationships.md`, `rules/field-types.md`,
`references/lint-rules.md` | the Relationship Patterns table's link to
`rules/relationships.md` (unchanged) |
| upgrade #2 (conditionalRequired) | `requiredWhen` |
`references/examples-upgrade.md` | the v17-canonical shapes pointer |
| upgrade #3 (transform residue) | `never executed` |
`references/examples-upgrade.md` | the worked R1 pointer |
Limit of the method: substring presence is not a graded run — it cannot
say whether an agent given the prompt would follow the pointer. It is
the reading the card can have today; no runner was built (item 6). No
assertion was tuned.
## Token ratchet (`scripts/check-skills-token-ratchet.mjs`, convention
ceil(utf8 bytes / 4))
Bundle total 152,338 → **154,396** (+2,058: the 20 pointer lines, seven
5-line TOCs, four new-file titles, minus the description trim);
ratcheted ceiling sum 157,621 → 154,915 (the four entry re-locks bank
their shrink). Gate and `--self-test` green on this head (54 authored
files within ceilings, 65 self-test cases).
| Row | Ceiling before → after | Kind |
|:--|:--|:--|
| `objectstack-platform/SKILL.md` | 12984 → 5833 | re-lock at landed
count |
| `objectstack-automation/SKILL.md` | 12768 → 5762 | re-lock |
| `objectstack-data/SKILL.md` | 10009 → 6128 | re-lock |
| `objectstack-upgrade/SKILL.md` | 8333 → 6193 | re-lock |
| `objectstack-data/rules/field-types.md` | 3032 → 3158 | **raise** +126
(TOC; zero headroom) — ruling cited in the row |
| `objectstack-ui/rules/dashboards.md` | 6090 → 6252 | **raise** +162
(TOC; zero headroom) |
| `objectstack-ui/rules/list-views.md` | 3011 → 3141 | **raise** +130
(TOC +132, 2 absorbed) |
| `objectstack-ui/rules/pages.md` | 5501 → 5692 | **raise** +191 (TOC;
zero headroom) |
| `objectstack-data/references/data-hooks.md` | 12611 → 10066 | re-lock
(TOC +182 landed inside 2,727 headroom) |
| `objectstack-data/rules/relationships.md` | 3778 → 3676 | re-lock (TOC
+154 inside 256 headroom) |
| `objectstack-data/rules/validation.md` | 3109 → 2756 | re-lock (TOC
+155 inside 508 headroom) |
| 9 new rows | `examples-flows` 1436 · `state-machines-and-approvals`
5569 · `examples-objects` 1779 · `lint-rules` 970 · `seeds` 1299 ·
`bootstrap` 1351 · `operations` 3125 · `plugin-development` 3137 ·
`examples-upgrade` 1197 | pinned AT landed count, zero headroom |
The dispatch's assumption that all seven TOC'd rows sat at zero headroom
was false for four of them; those four are re-locked (a lowering, always
legitimate) rather than raised.
## Other gate data that followed the moved text (no new gate, ratchet or
check script)
- `scripts/role-word-baseline.json`: the automation entry's one `role`
occurrence (the Approver Types row) and the upgrade entry's one (`role:`
in the v17 agent shape) moved with their sections; the two ledger rows
moved with them. 44 files / 123 occurrences before and after — a
relocation, not an expansion; `check:role-word` green.
- `scripts/sync-scaffold-emission-policy.mjs`: the published-restatement
row that locates the Complete Working Example's `package.json` fence by
heading now points at `references/bootstrap.md`, where the fence lives;
`check:scaffold-emission-policy` green (2 carriers).
- Generator-owned files: `check:skill-refs` stays green without
regeneration — `build-skill-references.ts` owns only `_index.md`,
`*.zod.ts` and subfolders under `references/`, so the new top-level
hand-written files are inputs it tolerates; `_index.md` lists Zod
schemas only. `gen:skill-docs` regenerated `skills/README.md` and
`content/docs/ai/skills-reference.mdx` (the one file outside `skills/**`
and the gate scripts).
- `check-skill-identifier-liveness` leg-2 bindings (`## Seed Data` on
platform, `### Access depth …` on data) stayed in their entries.
## Gates (captured exit before any pipe; union derived by `node
scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack
--commands` on `011dfd603`, 70 families, `--ran` reconciles 70/70 with
exit codes)
All 70 derived families exit 0 on `011dfd603`, plus `pnpm --filter
@objectstack/spec check:generated` (15 artifacts up to date after the
`origin/main` merge). The ones that read a build were run after `pnpm
--filter '@objectstack/lint...' build` and `pnpm --filter
'@objectstack/client-react...' build` under the shared verify lock:
`check:skill-examples` — "258 prose examples type-check across 3
surface(s)" (the moved os:check blocks included); `check:docs`;
`check:docs-transcript-drift`; the two `@objectstack/lint` doc checks.
Highlights: `check:skills-token-ratchet` + self-test ✓ ·
`check:skill-docs` ✓ · `check:skill-refs` ✓ ·
`check:skill-identifier-liveness` ✓ · `check:skill-top-level-keys` ✓ ·
`check:skill-compatibility` ✓ · `check:skill-frame-sync` ✓ ·
`check:doc-authoring` ✓ · `check:role-word` ✓ ·
`check:scaffold-emission-policy` ✓ · `check:nul-bytes` ✓ ·
`check:pm-dispatch-gates` (1905 cases) ✓ · `bare-root-worklist
--self-test` ✓ (the `skills/*/references/**` liveness/precision pin
holds over the enlarged population). `pnpm lint` (repo-wide eslint) is
CI's run: the diff touches no `.ts`/`.js` source, only markdown, one
JSON ledger and two `.mjs` gate scripts whose own self-tests ran green.
Branch merged `origin/main` `170fd836a` (three spec commits, no overlap
with this diff) before opening; `packages/spec` was rebuilt after the
merge.
## Changeset
`skip-changeset`, per the last merged `skills/**` PR (#19721:
`documentation` · `skip-changeset`, Clause-②: no) and measured: no
workspace package's `files[]` ships `skills/` (positive control:
`packages/cli` ships `bin`). `Clause-②: no`. Tier H — draft, the
maintainer merges by hand.
## Acceptance notes
- Two data eval terms were already reachable only through `rules/` on
the base (`schemaMode`, `type: 'secret'`) — noted, not a card.
- `objectstack-ui/rules/pages.md` lines 356/448 carry
`./crm_index.md`-style example links that resolve to nothing; they are
illustrative package-docs text inside the Docs section, untouched here —
noted, not a card.
---
_Generated by [Claude
Code](https://claude.ai/code/session_01Wnstp2kTth7sGXfr8fXypc)_
---
_Generated by [Claude Code](https://claude.ai/code)_
---------
Co-authored-by: Claude <noreply@anthropic.com>
Copy file name to clipboardExpand all lines: content/docs/ai/skills-reference.mdx
+3-3Lines changed: 3 additions & 3 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -46,7 +46,7 @@ ObjectStack ships **10 skills** — one per authoring domain, plus process skill
46
46
| # | Skill | Domain | Path | What it covers |
47
47
| :--- | :--- | :--- | :--- | :--- |
48
48
| 1 |[Platform](#platform)|`platform`|`skills/objectstack-platform/`| Bootstrap, configure, extend, and operate ObjectStack runtimes. Covers project setup (`defineStack`, drivers, scaffolding), declaring platform capabilities (`requires:` — which service plugins boot), plugin and service development (PluginContext, DI, kernel hooks like `kernel:ready`), and operations (CLI commands, migrations, deployment, test harnesses via LiteKernel). |
49
-
| 2 |[Data](#data)|`data`|`skills/objectstack-data/`| Design ObjectStack data schemas — objects, fields, field conditional rules, relationships, validations, indexes, lifecycle hooks, permissions, row-level security, data `lifecycle` retention/TTL/rotation, metadata `protection` locks, and external / federated datasources (`defineDatasource`) — and the seeds (`defineSeed()`) that load fixtures and reference data alongside them. |
49
+
| 2 |[Data](#data)|`data`|`skills/objectstack-data/`| Design ObjectStack data schemas — objects, fields, relationships, validations, indexes, hooks, security, seeds and datasources. |
Design ObjectStack data schemas — objects, fields, field conditional rules, relationships, validations, indexes, lifecycle hooks, permissions, row-level security, data `lifecycle` retention/TTL/rotation, metadata `protection` locks, and external / federated datasources (`defineDatasource`) — and the seeds (`defineSeed()`) that load fixtures and reference data alongside them.
79
+
Design ObjectStack data schemas — objects, fields, relationships, validations, indexes, hooks, security, seeds and datasources.
80
80
81
81
Use when the user is creating or modifying `*.object.ts` files or `src/data/*.ts` seed modules, picking field types, modelling relationships, writing `beforeInsert`/`afterUpdate` hooks, configuring per-object access control, pointing an object at an existing external database, or authoring bootstrap / demo data. Use for `visibleWhen` / `readonlyWhen` / `requiredWhen` rules that belong on fields.
82
82
83
-
Do not use for querying data (see objectstack-query) or for plugin / kernel hooks (see objectstack-platform). CEL expressions in formulas / validations / sharing rules / dynamic seed values: load objectstack-formula alongside.
83
+
Do not use for querying data (see objectstack-query) or for plugin / kernel hooks (see objectstack-platform). CEL expressions: load objectstack-formula alongside.
Copy file name to clipboardExpand all lines: skills/README.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -38,7 +38,7 @@ apps too).
38
38
| Skill | Domain | What it covers |
39
39
|:------|:-------|:---------------|
40
40
|[Platform](./objectstack-platform/SKILL.md)|`platform`| Bootstrap, configure, extend, and operate ObjectStack runtimes. Covers project setup (`defineStack`, drivers, scaffolding), declaring platform capabilities (`requires:` — which service plugins boot), plugin and service development (PluginContext, DI, kernel hooks like `kernel:ready`), and operations (CLI commands, migrations, deployment, test harnesses via LiteKernel). |
41
-
|[Data](./objectstack-data/SKILL.md)|`data`| Design ObjectStack data schemas — objects, fields, field conditional rules, relationships, validations, indexes, lifecycle hooks, permissions, row-level security, data `lifecycle` retention/TTL/rotation, metadata `protection` locks, and external / federated datasources (`defineDatasource`) — and the seeds (`defineSeed()`) that load fixtures and reference data alongside them. |
41
+
|[Data](./objectstack-data/SKILL.md)|`data`| Design ObjectStack data schemas — objects, fields, relationships, validations, indexes, hooks, security, seeds and datasources. |
0 commit comments