Skills optimization flight — skills/objectstack-data: RESTRUCTURE (≈ −10,150 tok, −22%) — hooks taught twice across two files, generic-JS patterns, 3.3% example gate coverage, sharingModel used by 31/31 objects and explained nowhere #14297

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/maina59f78d (skills/** byte-identical at d63c8a2); 43 findings DATA-A-01 … DATA-I-04. The full findings table is the audit record: the dev posts it verbatim as the first comment on this card at claim time (source: the seat container's scratchpad audit/objectstack-data/findings.md).

Audit summary

12 files, 4,942 lines, 45,780 hand-authored tokens (+1,483 generated) = 25.2% of the published catalog, 29% larger than the next package; total headroom across 10 ratcheted files: 47 tokens, five at 0. Real usage (examples/** + packages/apps/**): 31 ObjectSchema.create() calls in 26 object files, ~250 Field.* calls vs 22 literals (92% factory), 3 defineSeed modules, 2 hook files, 2 datasource files, 0 *.seed.ts. All 9 patterns with ≥3 real usages are covered; 8 documented surfaces have zero corpus usage; two high-frequency keys have no coverage at all. Verdict RESTRUCTURE: hooks (14,779 tok, 32% of the package) are split across rules/hooks.md and references/data-hooks.md where the second calls itself a pointer and then restates five sections; the rules/ routing table is buried at line 312 of 1,216; the package holds 41% of the catalog's TypeScript (151 fences) with 3.3% os:check coverage — seven unmarked self-contained blocks would fail check-skill-examples today.

Top findings (token-delta × confidence)

idspanproposalΔtok
DATA-B-01 / I-03rules/hooks.md (whole) ∥ references/data-hooks.mdMERGE-INTO one file — hooks.md:3 calls itself "a reference pointer", then restates 5 sections−1,880
DATA-D-04references/data-hooks.md:765-1046DELETE patterns 1,2,4,5,7,9 (generic JS); keep 3,6,8,10−1,000
DATA-C-05SKILL.md:858-971REWRITE-AS-CONSTRUCT — 3 near-identical examples + Studio-banner narration for a 4-value enum; 0 corpus uses−600
DATA-B-04references/data-hooks.md:1050-1133DELETE — "Registration, three methods" also at rules/hooks.md:145-176−566
DATA-D-11rules/naming.md:15-93, 103-107DELETE — 6 ❌/✅ pairs + rationale for a rule the regex at :9 already states−566
DATA-D-06rules/indexing.md:161-234REWRITE-AS-CONSTRUCT — one textbook fact (left-to-right) in 3 subsections−480
DATA-B-03rules/hooks.md:99-126data-hooks.md:41-70DELETE one copy of the 8-event table−466
DATA-C-0425 tombstone sitesDELETE standalone blocks — each key is refused by a parse error carrying its own prescription; objectstack-upgrade owns this−450
DATA-C-03references/data-hooks.md:1209-1275DELETE — vitest + LiteKernel harnesses; platform's frontmatter claims that surface−432
DATA-D-07rules/indexing.md:277-298, 312-340DELETE — unsourced Table Size → Max Indexes table, pg_stat_user_indexes SQL, 10 best-practices−430
DATA-B-05references/data-hooks.md:1136-1160DELETE — DO/DON'T also at rules/hooks.md:180-194−418
DATA-D-12SKILL.md:540-555DELETE — "CRM Schema Blueprint" points at 6 things covered above it−358
DATA-C-01SKILL.md:162-189DELETE — two verbatim CLI/HTTP error transcripts; the 400 text is word-for-word in objectstack-query−343
DATA-D-09rules/validation.md:420-438DELETE — best-practices + unsourced perf claims−338
DATA-D-01/02/03references/data-hooks.md:1279-1444DELETE — invented benchmark table, "Advanced Topics" (a for loop), Troubleshooting, Summary−990

Net after +825 of paid additions ≈ −10,150 tokens (−22.2%), touching none of the 9 live patterns.

Incidental falsehoods (fix in this flight)

  • INC-01 SKILL.md:393required: true → false "dev auto-heals (autoMigrate:'safe')". Nullability drift is compared against storage.notNull, NOT required (packages/drivers/driver-sql/src/schema-drift.ts:795-798; field.zod.tsrequired.describe()), and the emitted op is severity: 'warning', category: 'needs_confirm', op: 'relax_not_null' — never auto-applied. HIGH.
  • INC-02 SKILL.md:398-401 — the "stale NOT NULL column" 400 story: schema-drift.ts:800-802 says that configuration produces a raw driver error, not a clean validation 400. MED.

Three funded additions

  1. sharingModel (DATA-F-01, +130, paid by DATA-C-05) — used by 31/31 real objects, absent from both property tables; an object publish with no authored sharingModel is refused (security-owd-unset, packages/lint/src/validate-security-posture.ts:62).
  2. Field.* factory spelling in rules/field-types.md (DATA-E-03, +150, paid by DATA-D-14 + DATA-D-11) — the file whose job is field authoring contains zero Field.*; corpus is 92% factory.
  3. required vs storage.notNull (DATA-F-02, +60) and 4 security-lint rows (DATA-F-04, +90), paid by DATA-D-15 + DATA-D-13.

Flight scope

IMPLEMENT (same-file, shrink-only): every DELETE / MERGE-INTO / REWRITE-AS-CONSTRUCT row in the findings table at HIGH or MED confidence; the three funded additions; INC-01/INC-02 corrections; os:check markers on the top-traffic examples with the seven would-fail blocks repaired (DATA-E-01/03/05); the hooks consolidation — delete rules/hooks.md, keep references/data-hooks.md as the single hooks file with its unique content preserved and paid by the data-hooks deletions; drop the deleted file's ceiling row.

ANCHOR RULINGS (this package is the anchor): objects, fields, relationships, hooks, seeds, datasources, permissions/RLS. Sibling flights (ui, api, platform, query, automation) delete their copies and point HERE — keep the paths rules/relationships.md, rules/datasources.md, rules/field-types.md, references/data-hooks.md stable. The inbound link rules/hooks.md:202 → objectstack-platform rules/plugin-hooks-events.md: the platform flight retires that file; re-point to objectstack-platform/references/plugin-hooks.md. DATA-C-03 (test harness) → delete + one-line pointer to objectstack-platform. DATA-C-01 → delete (query keeps its copy).

DEFER (pending #14296): DATA-I-04 (new rules/security.md), DATA-H-01 (evals ceiling / stub), DATA-F-07 (defineHook() prescription — maintainer call; record as a follow-up in the PR body), DATA-F-05 retire-surface candidates → shrink to one schema-pointing row, do not delete.

Flight constraints (binding)

  • ONE draft PR, first line Fixes #<this card>; governed (skills/** md) ⇒ 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; scripts/check-skills-token-ratchet.mjs touched ONLY to drop the row of a file this PR deletes.
  • ⛔ Never edit another package's files: MERGE-INTO another package = DELETE here + one-line pointer; a missing/weaker anchor goes in the PR body under "follow-up for ".
  • Generated files untouched (references/_index.md); frontmatter edits ⇒ regenerate skills/README.md (pnpm --filter @objectstack/spec gen:skill-docs).
  • Live surface with zero measured usage ⇒ one row pointing at its schema, never delete the last mention; retired/tombstoned surface ⇒ delete.
  • A false claim matching a spec .describe() string ⇒ file the spec-side twin as an out-of-scope 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 list keyed by finding id; per-file token delta; needs:contract-review on both carriers if any operator/contract-semantics claim changes (INC-01 does).

Refs: #14292 · #14296 (batch-1 decisions) · #13658 (truth sweep).

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

documentationImprovements or additions to documentationdomain:skillspriority:p1High: required for production / M2

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

    , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
     blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
    }
    } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
    })();
    (function(){
    try {
    var __m = "github.com";
    var __re = new RegExp('^' + "github\\.com" + '
    
    Skip to content

    Skills optimization flight — skills/objectstack-data: RESTRUCTURE (≈ −10,150 tok, −22%) — hooks taught twice across two files, generic-JS patterns, 3.3% example gate coverage, sharingModel used by 31/31 objects and explained nowhere #14297

    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/maina59f78d (skills/** byte-identical at d63c8a2); 43 findings DATA-A-01 … DATA-I-04. The full findings table is the audit record: the dev posts it verbatim as the first comment on this card at claim time (source: the seat container's scratchpad audit/objectstack-data/findings.md).

    Audit summary

    12 files, 4,942 lines, 45,780 hand-authored tokens (+1,483 generated) = 25.2% of the published catalog, 29% larger than the next package; total headroom across 10 ratcheted files: 47 tokens, five at 0. Real usage (examples/** + packages/apps/**): 31 ObjectSchema.create() calls in 26 object files, ~250 Field.* calls vs 22 literals (92% factory), 3 defineSeed modules, 2 hook files, 2 datasource files, 0 *.seed.ts. All 9 patterns with ≥3 real usages are covered; 8 documented surfaces have zero corpus usage; two high-frequency keys have no coverage at all. Verdict RESTRUCTURE: hooks (14,779 tok, 32% of the package) are split across rules/hooks.md and references/data-hooks.md where the second calls itself a pointer and then restates five sections; the rules/ routing table is buried at line 312 of 1,216; the package holds 41% of the catalog's TypeScript (151 fences) with 3.3% os:check coverage — seven unmarked self-contained blocks would fail check-skill-examples today.

    Top findings (token-delta × confidence)

    idspanproposalΔtok
    DATA-B-01 / I-03rules/hooks.md (whole) ∥ references/data-hooks.mdMERGE-INTO one file — hooks.md:3 calls itself "a reference pointer", then restates 5 sections−1,880
    DATA-D-04references/data-hooks.md:765-1046DELETE patterns 1,2,4,5,7,9 (generic JS); keep 3,6,8,10−1,000
    DATA-C-05SKILL.md:858-971REWRITE-AS-CONSTRUCT — 3 near-identical examples + Studio-banner narration for a 4-value enum; 0 corpus uses−600
    DATA-B-04references/data-hooks.md:1050-1133DELETE — "Registration, three methods" also at rules/hooks.md:145-176−566
    DATA-D-11rules/naming.md:15-93, 103-107DELETE — 6 ❌/✅ pairs + rationale for a rule the regex at :9 already states−566
    DATA-D-06rules/indexing.md:161-234REWRITE-AS-CONSTRUCT — one textbook fact (left-to-right) in 3 subsections−480
    DATA-B-03rules/hooks.md:99-126data-hooks.md:41-70DELETE one copy of the 8-event table−466
    DATA-C-0425 tombstone sitesDELETE standalone blocks — each key is refused by a parse error carrying its own prescription; objectstack-upgrade owns this−450
    DATA-C-03references/data-hooks.md:1209-1275DELETE — vitest + LiteKernel harnesses; platform's frontmatter claims that surface−432
    DATA-D-07rules/indexing.md:277-298, 312-340DELETE — unsourced Table Size → Max Indexes table, pg_stat_user_indexes SQL, 10 best-practices−430
    DATA-B-05references/data-hooks.md:1136-1160DELETE — DO/DON'T also at rules/hooks.md:180-194−418
    DATA-D-12SKILL.md:540-555DELETE — "CRM Schema Blueprint" points at 6 things covered above it−358
    DATA-C-01SKILL.md:162-189DELETE — two verbatim CLI/HTTP error transcripts; the 400 text is word-for-word in objectstack-query−343
    DATA-D-09rules/validation.md:420-438DELETE — best-practices + unsourced perf claims−338
    DATA-D-01/02/03references/data-hooks.md:1279-1444DELETE — invented benchmark table, "Advanced Topics" (a for loop), Troubleshooting, Summary−990

    Net after +825 of paid additions ≈ −10,150 tokens (−22.2%), touching none of the 9 live patterns.

    Incidental falsehoods (fix in this flight)

    • INC-01 SKILL.md:393required: true → false "dev auto-heals (autoMigrate:'safe')". Nullability drift is compared against storage.notNull, NOT required (packages/drivers/driver-sql/src/schema-drift.ts:795-798; field.zod.tsrequired.describe()), and the emitted op is severity: 'warning', category: 'needs_confirm', op: 'relax_not_null' — never auto-applied. HIGH.
    • INC-02 SKILL.md:398-401 — the "stale NOT NULL column" 400 story: schema-drift.ts:800-802 says that configuration produces a raw driver error, not a clean validation 400. MED.

    Three funded additions

    1. sharingModel (DATA-F-01, +130, paid by DATA-C-05) — used by 31/31 real objects, absent from both property tables; an object publish with no authored sharingModel is refused (security-owd-unset, packages/lint/src/validate-security-posture.ts:62).
    2. Field.* factory spelling in rules/field-types.md (DATA-E-03, +150, paid by DATA-D-14 + DATA-D-11) — the file whose job is field authoring contains zero Field.*; corpus is 92% factory.
    3. required vs storage.notNull (DATA-F-02, +60) and 4 security-lint rows (DATA-F-04, +90), paid by DATA-D-15 + DATA-D-13.

    Flight scope

    IMPLEMENT (same-file, shrink-only): every DELETE / MERGE-INTO / REWRITE-AS-CONSTRUCT row in the findings table at HIGH or MED confidence; the three funded additions; INC-01/INC-02 corrections; os:check markers on the top-traffic examples with the seven would-fail blocks repaired (DATA-E-01/03/05); the hooks consolidation — delete rules/hooks.md, keep references/data-hooks.md as the single hooks file with its unique content preserved and paid by the data-hooks deletions; drop the deleted file's ceiling row.

    ANCHOR RULINGS (this package is the anchor): objects, fields, relationships, hooks, seeds, datasources, permissions/RLS. Sibling flights (ui, api, platform, query, automation) delete their copies and point HERE — keep the paths rules/relationships.md, rules/datasources.md, rules/field-types.md, references/data-hooks.md stable. The inbound link rules/hooks.md:202 → objectstack-platform rules/plugin-hooks-events.md: the platform flight retires that file; re-point to objectstack-platform/references/plugin-hooks.md. DATA-C-03 (test harness) → delete + one-line pointer to objectstack-platform. DATA-C-01 → delete (query keeps its copy).

    DEFER (pending #14296): DATA-I-04 (new rules/security.md), DATA-H-01 (evals ceiling / stub), DATA-F-07 (defineHook() prescription — maintainer call; record as a follow-up in the PR body), DATA-F-05 retire-surface candidates → shrink to one schema-pointing row, do not delete.

    Flight constraints (binding)

    • ONE draft PR, first line Fixes #<this card>; governed (skills/** md) ⇒ 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; scripts/check-skills-token-ratchet.mjs touched ONLY to drop the row of a file this PR deletes.
    • ⛔ Never edit another package's files: MERGE-INTO another package = DELETE here + one-line pointer; a missing/weaker anchor goes in the PR body under "follow-up for ".
    • Generated files untouched (references/_index.md); frontmatter edits ⇒ regenerate skills/README.md (pnpm --filter @objectstack/spec gen:skill-docs).
    • Live surface with zero measured usage ⇒ one row pointing at its schema, never delete the last mention; retired/tombstoned surface ⇒ delete.
    • A false claim matching a spec .describe() string ⇒ file the spec-side twin as an out-of-scope 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 list keyed by finding id; per-file token delta; needs:contract-review on both carriers if any operator/contract-semantics claim changes (INC-01 does).

    Refs: #14292 · #14296 (batch-1 decisions) · #13658 (truth sweep).

    Activity

    Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

    Metadata

    Metadata

    Assignees

    Labels

    documentationImprovements or additions to documentationdomain:skillspriority:p1High: required for production / M2

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions

      , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
      Skip to content

      Skills optimization flight — skills/objectstack-data: RESTRUCTURE (≈ −10,150 tok, −22%) — hooks taught twice across two files, generic-JS patterns, 3.3% example gate coverage, sharingModel used by 31/31 objects and explained nowhere #14297

      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/maina59f78d (skills/** byte-identical at d63c8a2); 43 findings DATA-A-01 … DATA-I-04. The full findings table is the audit record: the dev posts it verbatim as the first comment on this card at claim time (source: the seat container's scratchpad audit/objectstack-data/findings.md).

      Audit summary

      12 files, 4,942 lines, 45,780 hand-authored tokens (+1,483 generated) = 25.2% of the published catalog, 29% larger than the next package; total headroom across 10 ratcheted files: 47 tokens, five at 0. Real usage (examples/** + packages/apps/**): 31 ObjectSchema.create() calls in 26 object files, ~250 Field.* calls vs 22 literals (92% factory), 3 defineSeed modules, 2 hook files, 2 datasource files, 0 *.seed.ts. All 9 patterns with ≥3 real usages are covered; 8 documented surfaces have zero corpus usage; two high-frequency keys have no coverage at all. Verdict RESTRUCTURE: hooks (14,779 tok, 32% of the package) are split across rules/hooks.md and references/data-hooks.md where the second calls itself a pointer and then restates five sections; the rules/ routing table is buried at line 312 of 1,216; the package holds 41% of the catalog's TypeScript (151 fences) with 3.3% os:check coverage — seven unmarked self-contained blocks would fail check-skill-examples today.

      Top findings (token-delta × confidence)

      idspanproposalΔtok
      DATA-B-01 / I-03rules/hooks.md (whole) ∥ references/data-hooks.mdMERGE-INTO one file — hooks.md:3 calls itself "a reference pointer", then restates 5 sections−1,880
      DATA-D-04references/data-hooks.md:765-1046DELETE patterns 1,2,4,5,7,9 (generic JS); keep 3,6,8,10−1,000
      DATA-C-05SKILL.md:858-971REWRITE-AS-CONSTRUCT — 3 near-identical examples + Studio-banner narration for a 4-value enum; 0 corpus uses−600
      DATA-B-04references/data-hooks.md:1050-1133DELETE — "Registration, three methods" also at rules/hooks.md:145-176−566
      DATA-D-11rules/naming.md:15-93, 103-107DELETE — 6 ❌/✅ pairs + rationale for a rule the regex at :9 already states−566
      DATA-D-06rules/indexing.md:161-234REWRITE-AS-CONSTRUCT — one textbook fact (left-to-right) in 3 subsections−480
      DATA-B-03rules/hooks.md:99-126data-hooks.md:41-70DELETE one copy of the 8-event table−466
      DATA-C-0425 tombstone sitesDELETE standalone blocks — each key is refused by a parse error carrying its own prescription; objectstack-upgrade owns this−450
      DATA-C-03references/data-hooks.md:1209-1275DELETE — vitest + LiteKernel harnesses; platform's frontmatter claims that surface−432
      DATA-D-07rules/indexing.md:277-298, 312-340DELETE — unsourced Table Size → Max Indexes table, pg_stat_user_indexes SQL, 10 best-practices−430
      DATA-B-05references/data-hooks.md:1136-1160DELETE — DO/DON'T also at rules/hooks.md:180-194−418
      DATA-D-12SKILL.md:540-555DELETE — "CRM Schema Blueprint" points at 6 things covered above it−358
      DATA-C-01SKILL.md:162-189DELETE — two verbatim CLI/HTTP error transcripts; the 400 text is word-for-word in objectstack-query−343
      DATA-D-09rules/validation.md:420-438DELETE — best-practices + unsourced perf claims−338
      DATA-D-01/02/03references/data-hooks.md:1279-1444DELETE — invented benchmark table, "Advanced Topics" (a for loop), Troubleshooting, Summary−990

      Net after +825 of paid additions ≈ −10,150 tokens (−22.2%), touching none of the 9 live patterns.

      Incidental falsehoods (fix in this flight)

      • INC-01 SKILL.md:393required: true → false "dev auto-heals (autoMigrate:'safe')". Nullability drift is compared against storage.notNull, NOT required (packages/drivers/driver-sql/src/schema-drift.ts:795-798; field.zod.tsrequired.describe()), and the emitted op is severity: 'warning', category: 'needs_confirm', op: 'relax_not_null' — never auto-applied. HIGH.
      • INC-02 SKILL.md:398-401 — the "stale NOT NULL column" 400 story: schema-drift.ts:800-802 says that configuration produces a raw driver error, not a clean validation 400. MED.

      Three funded additions

      1. sharingModel (DATA-F-01, +130, paid by DATA-C-05) — used by 31/31 real objects, absent from both property tables; an object publish with no authored sharingModel is refused (security-owd-unset, packages/lint/src/validate-security-posture.ts:62).
      2. Field.* factory spelling in rules/field-types.md (DATA-E-03, +150, paid by DATA-D-14 + DATA-D-11) — the file whose job is field authoring contains zero Field.*; corpus is 92% factory.
      3. required vs storage.notNull (DATA-F-02, +60) and 4 security-lint rows (DATA-F-04, +90), paid by DATA-D-15 + DATA-D-13.

      Flight scope

      IMPLEMENT (same-file, shrink-only): every DELETE / MERGE-INTO / REWRITE-AS-CONSTRUCT row in the findings table at HIGH or MED confidence; the three funded additions; INC-01/INC-02 corrections; os:check markers on the top-traffic examples with the seven would-fail blocks repaired (DATA-E-01/03/05); the hooks consolidation — delete rules/hooks.md, keep references/data-hooks.md as the single hooks file with its unique content preserved and paid by the data-hooks deletions; drop the deleted file's ceiling row.

      ANCHOR RULINGS (this package is the anchor): objects, fields, relationships, hooks, seeds, datasources, permissions/RLS. Sibling flights (ui, api, platform, query, automation) delete their copies and point HERE — keep the paths rules/relationships.md, rules/datasources.md, rules/field-types.md, references/data-hooks.md stable. The inbound link rules/hooks.md:202 → objectstack-platform rules/plugin-hooks-events.md: the platform flight retires that file; re-point to objectstack-platform/references/plugin-hooks.md. DATA-C-03 (test harness) → delete + one-line pointer to objectstack-platform. DATA-C-01 → delete (query keeps its copy).

      DEFER (pending #14296): DATA-I-04 (new rules/security.md), DATA-H-01 (evals ceiling / stub), DATA-F-07 (defineHook() prescription — maintainer call; record as a follow-up in the PR body), DATA-F-05 retire-surface candidates → shrink to one schema-pointing row, do not delete.

      Flight constraints (binding)

      • ONE draft PR, first line Fixes #<this card>; governed (skills/** md) ⇒ 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; scripts/check-skills-token-ratchet.mjs touched ONLY to drop the row of a file this PR deletes.
      • ⛔ Never edit another package's files: MERGE-INTO another package = DELETE here + one-line pointer; a missing/weaker anchor goes in the PR body under "follow-up for ".
      • Generated files untouched (references/_index.md); frontmatter edits ⇒ regenerate skills/README.md (pnpm --filter @objectstack/spec gen:skill-docs).
      • Live surface with zero measured usage ⇒ one row pointing at its schema, never delete the last mention; retired/tombstoned surface ⇒ delete.
      • A false claim matching a spec .describe() string ⇒ file the spec-side twin as an out-of-scope 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 list keyed by finding id; per-file token delta; needs:contract-review on both carriers if any operator/contract-semantics claim changes (INC-01 does).

      Refs: #14292 · #14296 (batch-1 decisions) · #13658 (truth sweep).

      Activity

      Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

      Metadata

      Metadata

      Assignees

      Labels

      documentationImprovements or additions to documentationdomain:skillspriority:p1High: required for production / M2

      Type

      No type

      Projects

      No projects

        Milestone

        No milestone

        Relationships

        None yet

        Development

        No branches or pull requests

        Issue actions

        , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
        Skip to content

        Skills optimization flight — skills/objectstack-data: RESTRUCTURE (≈ −10,150 tok, −22%) — hooks taught twice across two files, generic-JS patterns, 3.3% example gate coverage, sharingModel used by 31/31 objects and explained nowhere #14297

        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/maina59f78d (skills/** byte-identical at d63c8a2); 43 findings DATA-A-01 … DATA-I-04. The full findings table is the audit record: the dev posts it verbatim as the first comment on this card at claim time (source: the seat container's scratchpad audit/objectstack-data/findings.md).

        Audit summary

        12 files, 4,942 lines, 45,780 hand-authored tokens (+1,483 generated) = 25.2% of the published catalog, 29% larger than the next package; total headroom across 10 ratcheted files: 47 tokens, five at 0. Real usage (examples/** + packages/apps/**): 31 ObjectSchema.create() calls in 26 object files, ~250 Field.* calls vs 22 literals (92% factory), 3 defineSeed modules, 2 hook files, 2 datasource files, 0 *.seed.ts. All 9 patterns with ≥3 real usages are covered; 8 documented surfaces have zero corpus usage; two high-frequency keys have no coverage at all. Verdict RESTRUCTURE: hooks (14,779 tok, 32% of the package) are split across rules/hooks.md and references/data-hooks.md where the second calls itself a pointer and then restates five sections; the rules/ routing table is buried at line 312 of 1,216; the package holds 41% of the catalog's TypeScript (151 fences) with 3.3% os:check coverage — seven unmarked self-contained blocks would fail check-skill-examples today.

        Top findings (token-delta × confidence)

        idspanproposalΔtok
        DATA-B-01 / I-03rules/hooks.md (whole) ∥ references/data-hooks.mdMERGE-INTO one file — hooks.md:3 calls itself "a reference pointer", then restates 5 sections−1,880
        DATA-D-04references/data-hooks.md:765-1046DELETE patterns 1,2,4,5,7,9 (generic JS); keep 3,6,8,10−1,000
        DATA-C-05SKILL.md:858-971REWRITE-AS-CONSTRUCT — 3 near-identical examples + Studio-banner narration for a 4-value enum; 0 corpus uses−600
        DATA-B-04references/data-hooks.md:1050-1133DELETE — "Registration, three methods" also at rules/hooks.md:145-176−566
        DATA-D-11rules/naming.md:15-93, 103-107DELETE — 6 ❌/✅ pairs + rationale for a rule the regex at :9 already states−566
        DATA-D-06rules/indexing.md:161-234REWRITE-AS-CONSTRUCT — one textbook fact (left-to-right) in 3 subsections−480
        DATA-B-03rules/hooks.md:99-126data-hooks.md:41-70DELETE one copy of the 8-event table−466
        DATA-C-0425 tombstone sitesDELETE standalone blocks — each key is refused by a parse error carrying its own prescription; objectstack-upgrade owns this−450
        DATA-C-03references/data-hooks.md:1209-1275DELETE — vitest + LiteKernel harnesses; platform's frontmatter claims that surface−432
        DATA-D-07rules/indexing.md:277-298, 312-340DELETE — unsourced Table Size → Max Indexes table, pg_stat_user_indexes SQL, 10 best-practices−430
        DATA-B-05references/data-hooks.md:1136-1160DELETE — DO/DON'T also at rules/hooks.md:180-194−418
        DATA-D-12SKILL.md:540-555DELETE — "CRM Schema Blueprint" points at 6 things covered above it−358
        DATA-C-01SKILL.md:162-189DELETE — two verbatim CLI/HTTP error transcripts; the 400 text is word-for-word in objectstack-query−343
        DATA-D-09rules/validation.md:420-438DELETE — best-practices + unsourced perf claims−338
        DATA-D-01/02/03references/data-hooks.md:1279-1444DELETE — invented benchmark table, "Advanced Topics" (a for loop), Troubleshooting, Summary−990

        Net after +825 of paid additions ≈ −10,150 tokens (−22.2%), touching none of the 9 live patterns.

        Incidental falsehoods (fix in this flight)

        • INC-01 SKILL.md:393required: true → false "dev auto-heals (autoMigrate:'safe')". Nullability drift is compared against storage.notNull, NOT required (packages/drivers/driver-sql/src/schema-drift.ts:795-798; field.zod.tsrequired.describe()), and the emitted op is severity: 'warning', category: 'needs_confirm', op: 'relax_not_null' — never auto-applied. HIGH.
        • INC-02 SKILL.md:398-401 — the "stale NOT NULL column" 400 story: schema-drift.ts:800-802 says that configuration produces a raw driver error, not a clean validation 400. MED.

        Three funded additions

        1. sharingModel (DATA-F-01, +130, paid by DATA-C-05) — used by 31/31 real objects, absent from both property tables; an object publish with no authored sharingModel is refused (security-owd-unset, packages/lint/src/validate-security-posture.ts:62).
        2. Field.* factory spelling in rules/field-types.md (DATA-E-03, +150, paid by DATA-D-14 + DATA-D-11) — the file whose job is field authoring contains zero Field.*; corpus is 92% factory.
        3. required vs storage.notNull (DATA-F-02, +60) and 4 security-lint rows (DATA-F-04, +90), paid by DATA-D-15 + DATA-D-13.

        Flight scope

        IMPLEMENT (same-file, shrink-only): every DELETE / MERGE-INTO / REWRITE-AS-CONSTRUCT row in the findings table at HIGH or MED confidence; the three funded additions; INC-01/INC-02 corrections; os:check markers on the top-traffic examples with the seven would-fail blocks repaired (DATA-E-01/03/05); the hooks consolidation — delete rules/hooks.md, keep references/data-hooks.md as the single hooks file with its unique content preserved and paid by the data-hooks deletions; drop the deleted file's ceiling row.

        ANCHOR RULINGS (this package is the anchor): objects, fields, relationships, hooks, seeds, datasources, permissions/RLS. Sibling flights (ui, api, platform, query, automation) delete their copies and point HERE — keep the paths rules/relationships.md, rules/datasources.md, rules/field-types.md, references/data-hooks.md stable. The inbound link rules/hooks.md:202 → objectstack-platform rules/plugin-hooks-events.md: the platform flight retires that file; re-point to objectstack-platform/references/plugin-hooks.md. DATA-C-03 (test harness) → delete + one-line pointer to objectstack-platform. DATA-C-01 → delete (query keeps its copy).

        DEFER (pending #14296): DATA-I-04 (new rules/security.md), DATA-H-01 (evals ceiling / stub), DATA-F-07 (defineHook() prescription — maintainer call; record as a follow-up in the PR body), DATA-F-05 retire-surface candidates → shrink to one schema-pointing row, do not delete.

        Flight constraints (binding)

        • ONE draft PR, first line Fixes #<this card>; governed (skills/** md) ⇒ 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; scripts/check-skills-token-ratchet.mjs touched ONLY to drop the row of a file this PR deletes.
        • ⛔ Never edit another package's files: MERGE-INTO another package = DELETE here + one-line pointer; a missing/weaker anchor goes in the PR body under "follow-up for ".
        • Generated files untouched (references/_index.md); frontmatter edits ⇒ regenerate skills/README.md (pnpm --filter @objectstack/spec gen:skill-docs).
        • Live surface with zero measured usage ⇒ one row pointing at its schema, never delete the last mention; retired/tombstoned surface ⇒ delete.
        • A false claim matching a spec .describe() string ⇒ file the spec-side twin as an out-of-scope 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 list keyed by finding id; per-file token delta; needs:contract-review on both carriers if any operator/contract-semantics claim changes (INC-01 does).

        Refs: #14292 · #14296 (batch-1 decisions) · #13658 (truth sweep).

        Activity

        Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

        Metadata

        Metadata

        Assignees

        Labels

        documentationImprovements or additions to documentationdomain:skillspriority:p1High: required for production / M2

        Type

        No type

        Projects

        No projects

          Milestone

          No milestone

          Relationships

          None yet

          Development

          No branches or pull requests

          Issue actions

          , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
          Skip to content

          Skills optimization flight — skills/objectstack-data: RESTRUCTURE (≈ −10,150 tok, −22%) — hooks taught twice across two files, generic-JS patterns, 3.3% example gate coverage, sharingModel used by 31/31 objects and explained nowhere #14297

          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/maina59f78d (skills/** byte-identical at d63c8a2); 43 findings DATA-A-01 … DATA-I-04. The full findings table is the audit record: the dev posts it verbatim as the first comment on this card at claim time (source: the seat container's scratchpad audit/objectstack-data/findings.md).

          Audit summary

          12 files, 4,942 lines, 45,780 hand-authored tokens (+1,483 generated) = 25.2% of the published catalog, 29% larger than the next package; total headroom across 10 ratcheted files: 47 tokens, five at 0. Real usage (examples/** + packages/apps/**): 31 ObjectSchema.create() calls in 26 object files, ~250 Field.* calls vs 22 literals (92% factory), 3 defineSeed modules, 2 hook files, 2 datasource files, 0 *.seed.ts. All 9 patterns with ≥3 real usages are covered; 8 documented surfaces have zero corpus usage; two high-frequency keys have no coverage at all. Verdict RESTRUCTURE: hooks (14,779 tok, 32% of the package) are split across rules/hooks.md and references/data-hooks.md where the second calls itself a pointer and then restates five sections; the rules/ routing table is buried at line 312 of 1,216; the package holds 41% of the catalog's TypeScript (151 fences) with 3.3% os:check coverage — seven unmarked self-contained blocks would fail check-skill-examples today.

          Top findings (token-delta × confidence)

          idspanproposalΔtok
          DATA-B-01 / I-03rules/hooks.md (whole) ∥ references/data-hooks.mdMERGE-INTO one file — hooks.md:3 calls itself "a reference pointer", then restates 5 sections−1,880
          DATA-D-04references/data-hooks.md:765-1046DELETE patterns 1,2,4,5,7,9 (generic JS); keep 3,6,8,10−1,000
          DATA-C-05SKILL.md:858-971REWRITE-AS-CONSTRUCT — 3 near-identical examples + Studio-banner narration for a 4-value enum; 0 corpus uses−600
          DATA-B-04references/data-hooks.md:1050-1133DELETE — "Registration, three methods" also at rules/hooks.md:145-176−566
          DATA-D-11rules/naming.md:15-93, 103-107DELETE — 6 ❌/✅ pairs + rationale for a rule the regex at :9 already states−566
          DATA-D-06rules/indexing.md:161-234REWRITE-AS-CONSTRUCT — one textbook fact (left-to-right) in 3 subsections−480
          DATA-B-03rules/hooks.md:99-126data-hooks.md:41-70DELETE one copy of the 8-event table−466
          DATA-C-0425 tombstone sitesDELETE standalone blocks — each key is refused by a parse error carrying its own prescription; objectstack-upgrade owns this−450
          DATA-C-03references/data-hooks.md:1209-1275DELETE — vitest + LiteKernel harnesses; platform's frontmatter claims that surface−432
          DATA-D-07rules/indexing.md:277-298, 312-340DELETE — unsourced Table Size → Max Indexes table, pg_stat_user_indexes SQL, 10 best-practices−430
          DATA-B-05references/data-hooks.md:1136-1160DELETE — DO/DON'T also at rules/hooks.md:180-194−418
          DATA-D-12SKILL.md:540-555DELETE — "CRM Schema Blueprint" points at 6 things covered above it−358
          DATA-C-01SKILL.md:162-189DELETE — two verbatim CLI/HTTP error transcripts; the 400 text is word-for-word in objectstack-query−343
          DATA-D-09rules/validation.md:420-438DELETE — best-practices + unsourced perf claims−338
          DATA-D-01/02/03references/data-hooks.md:1279-1444DELETE — invented benchmark table, "Advanced Topics" (a for loop), Troubleshooting, Summary−990

          Net after +825 of paid additions ≈ −10,150 tokens (−22.2%), touching none of the 9 live patterns.

          Incidental falsehoods (fix in this flight)

          • INC-01 SKILL.md:393required: true → false "dev auto-heals (autoMigrate:'safe')". Nullability drift is compared against storage.notNull, NOT required (packages/drivers/driver-sql/src/schema-drift.ts:795-798; field.zod.tsrequired.describe()), and the emitted op is severity: 'warning', category: 'needs_confirm', op: 'relax_not_null' — never auto-applied. HIGH.
          • INC-02 SKILL.md:398-401 — the "stale NOT NULL column" 400 story: schema-drift.ts:800-802 says that configuration produces a raw driver error, not a clean validation 400. MED.

          Three funded additions

          1. sharingModel (DATA-F-01, +130, paid by DATA-C-05) — used by 31/31 real objects, absent from both property tables; an object publish with no authored sharingModel is refused (security-owd-unset, packages/lint/src/validate-security-posture.ts:62).
          2. Field.* factory spelling in rules/field-types.md (DATA-E-03, +150, paid by DATA-D-14 + DATA-D-11) — the file whose job is field authoring contains zero Field.*; corpus is 92% factory.
          3. required vs storage.notNull (DATA-F-02, +60) and 4 security-lint rows (DATA-F-04, +90), paid by DATA-D-15 + DATA-D-13.

          Flight scope

          IMPLEMENT (same-file, shrink-only): every DELETE / MERGE-INTO / REWRITE-AS-CONSTRUCT row in the findings table at HIGH or MED confidence; the three funded additions; INC-01/INC-02 corrections; os:check markers on the top-traffic examples with the seven would-fail blocks repaired (DATA-E-01/03/05); the hooks consolidation — delete rules/hooks.md, keep references/data-hooks.md as the single hooks file with its unique content preserved and paid by the data-hooks deletions; drop the deleted file's ceiling row.

          ANCHOR RULINGS (this package is the anchor): objects, fields, relationships, hooks, seeds, datasources, permissions/RLS. Sibling flights (ui, api, platform, query, automation) delete their copies and point HERE — keep the paths rules/relationships.md, rules/datasources.md, rules/field-types.md, references/data-hooks.md stable. The inbound link rules/hooks.md:202 → objectstack-platform rules/plugin-hooks-events.md: the platform flight retires that file; re-point to objectstack-platform/references/plugin-hooks.md. DATA-C-03 (test harness) → delete + one-line pointer to objectstack-platform. DATA-C-01 → delete (query keeps its copy).

          DEFER (pending #14296): DATA-I-04 (new rules/security.md), DATA-H-01 (evals ceiling / stub), DATA-F-07 (defineHook() prescription — maintainer call; record as a follow-up in the PR body), DATA-F-05 retire-surface candidates → shrink to one schema-pointing row, do not delete.

          Flight constraints (binding)

          • ONE draft PR, first line Fixes #<this card>; governed (skills/** md) ⇒ 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; scripts/check-skills-token-ratchet.mjs touched ONLY to drop the row of a file this PR deletes.
          • ⛔ Never edit another package's files: MERGE-INTO another package = DELETE here + one-line pointer; a missing/weaker anchor goes in the PR body under "follow-up for ".
          • Generated files untouched (references/_index.md); frontmatter edits ⇒ regenerate skills/README.md (pnpm --filter @objectstack/spec gen:skill-docs).
          • Live surface with zero measured usage ⇒ one row pointing at its schema, never delete the last mention; retired/tombstoned surface ⇒ delete.
          • A false claim matching a spec .describe() string ⇒ file the spec-side twin as an out-of-scope 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 list keyed by finding id; per-file token delta; needs:contract-review on both carriers if any operator/contract-semantics claim changes (INC-01 does).

          Refs: #14292 · #14296 (batch-1 decisions) · #13658 (truth sweep).

          Activity

          Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

          Metadata

          Metadata

          Assignees

          Labels

          documentationImprovements or additions to documentationdomain:skillspriority:p1High: required for production / M2

          Type

          No type

          Projects

          No projects

            Milestone

            No milestone

            Relationships

            None yet

            Development

            No branches or pull requests

            Issue actions

            , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
            Skip to content

            Skills optimization flight — skills/objectstack-data: RESTRUCTURE (≈ −10,150 tok, −22%) — hooks taught twice across two files, generic-JS patterns, 3.3% example gate coverage, sharingModel used by 31/31 objects and explained nowhere #14297

            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/maina59f78d (skills/** byte-identical at d63c8a2); 43 findings DATA-A-01 … DATA-I-04. The full findings table is the audit record: the dev posts it verbatim as the first comment on this card at claim time (source: the seat container's scratchpad audit/objectstack-data/findings.md).

            Audit summary

            12 files, 4,942 lines, 45,780 hand-authored tokens (+1,483 generated) = 25.2% of the published catalog, 29% larger than the next package; total headroom across 10 ratcheted files: 47 tokens, five at 0. Real usage (examples/** + packages/apps/**): 31 ObjectSchema.create() calls in 26 object files, ~250 Field.* calls vs 22 literals (92% factory), 3 defineSeed modules, 2 hook files, 2 datasource files, 0 *.seed.ts. All 9 patterns with ≥3 real usages are covered; 8 documented surfaces have zero corpus usage; two high-frequency keys have no coverage at all. Verdict RESTRUCTURE: hooks (14,779 tok, 32% of the package) are split across rules/hooks.md and references/data-hooks.md where the second calls itself a pointer and then restates five sections; the rules/ routing table is buried at line 312 of 1,216; the package holds 41% of the catalog's TypeScript (151 fences) with 3.3% os:check coverage — seven unmarked self-contained blocks would fail check-skill-examples today.

            Top findings (token-delta × confidence)

            idspanproposalΔtok
            DATA-B-01 / I-03rules/hooks.md (whole) ∥ references/data-hooks.mdMERGE-INTO one file — hooks.md:3 calls itself "a reference pointer", then restates 5 sections−1,880
            DATA-D-04references/data-hooks.md:765-1046DELETE patterns 1,2,4,5,7,9 (generic JS); keep 3,6,8,10−1,000
            DATA-C-05SKILL.md:858-971REWRITE-AS-CONSTRUCT — 3 near-identical examples + Studio-banner narration for a 4-value enum; 0 corpus uses−600
            DATA-B-04references/data-hooks.md:1050-1133DELETE — "Registration, three methods" also at rules/hooks.md:145-176−566
            DATA-D-11rules/naming.md:15-93, 103-107DELETE — 6 ❌/✅ pairs + rationale for a rule the regex at :9 already states−566
            DATA-D-06rules/indexing.md:161-234REWRITE-AS-CONSTRUCT — one textbook fact (left-to-right) in 3 subsections−480
            DATA-B-03rules/hooks.md:99-126data-hooks.md:41-70DELETE one copy of the 8-event table−466
            DATA-C-0425 tombstone sitesDELETE standalone blocks — each key is refused by a parse error carrying its own prescription; objectstack-upgrade owns this−450
            DATA-C-03references/data-hooks.md:1209-1275DELETE — vitest + LiteKernel harnesses; platform's frontmatter claims that surface−432
            DATA-D-07rules/indexing.md:277-298, 312-340DELETE — unsourced Table Size → Max Indexes table, pg_stat_user_indexes SQL, 10 best-practices−430
            DATA-B-05references/data-hooks.md:1136-1160DELETE — DO/DON'T also at rules/hooks.md:180-194−418
            DATA-D-12SKILL.md:540-555DELETE — "CRM Schema Blueprint" points at 6 things covered above it−358
            DATA-C-01SKILL.md:162-189DELETE — two verbatim CLI/HTTP error transcripts; the 400 text is word-for-word in objectstack-query−343
            DATA-D-09rules/validation.md:420-438DELETE — best-practices + unsourced perf claims−338
            DATA-D-01/02/03references/data-hooks.md:1279-1444DELETE — invented benchmark table, "Advanced Topics" (a for loop), Troubleshooting, Summary−990

            Net after +825 of paid additions ≈ −10,150 tokens (−22.2%), touching none of the 9 live patterns.

            Incidental falsehoods (fix in this flight)

            • INC-01 SKILL.md:393required: true → false "dev auto-heals (autoMigrate:'safe')". Nullability drift is compared against storage.notNull, NOT required (packages/drivers/driver-sql/src/schema-drift.ts:795-798; field.zod.tsrequired.describe()), and the emitted op is severity: 'warning', category: 'needs_confirm', op: 'relax_not_null' — never auto-applied. HIGH.
            • INC-02 SKILL.md:398-401 — the "stale NOT NULL column" 400 story: schema-drift.ts:800-802 says that configuration produces a raw driver error, not a clean validation 400. MED.

            Three funded additions

            1. sharingModel (DATA-F-01, +130, paid by DATA-C-05) — used by 31/31 real objects, absent from both property tables; an object publish with no authored sharingModel is refused (security-owd-unset, packages/lint/src/validate-security-posture.ts:62).
            2. Field.* factory spelling in rules/field-types.md (DATA-E-03, +150, paid by DATA-D-14 + DATA-D-11) — the file whose job is field authoring contains zero Field.*; corpus is 92% factory.
            3. required vs storage.notNull (DATA-F-02, +60) and 4 security-lint rows (DATA-F-04, +90), paid by DATA-D-15 + DATA-D-13.

            Flight scope

            IMPLEMENT (same-file, shrink-only): every DELETE / MERGE-INTO / REWRITE-AS-CONSTRUCT row in the findings table at HIGH or MED confidence; the three funded additions; INC-01/INC-02 corrections; os:check markers on the top-traffic examples with the seven would-fail blocks repaired (DATA-E-01/03/05); the hooks consolidation — delete rules/hooks.md, keep references/data-hooks.md as the single hooks file with its unique content preserved and paid by the data-hooks deletions; drop the deleted file's ceiling row.

            ANCHOR RULINGS (this package is the anchor): objects, fields, relationships, hooks, seeds, datasources, permissions/RLS. Sibling flights (ui, api, platform, query, automation) delete their copies and point HERE — keep the paths rules/relationships.md, rules/datasources.md, rules/field-types.md, references/data-hooks.md stable. The inbound link rules/hooks.md:202 → objectstack-platform rules/plugin-hooks-events.md: the platform flight retires that file; re-point to objectstack-platform/references/plugin-hooks.md. DATA-C-03 (test harness) → delete + one-line pointer to objectstack-platform. DATA-C-01 → delete (query keeps its copy).

            DEFER (pending #14296): DATA-I-04 (new rules/security.md), DATA-H-01 (evals ceiling / stub), DATA-F-07 (defineHook() prescription — maintainer call; record as a follow-up in the PR body), DATA-F-05 retire-surface candidates → shrink to one schema-pointing row, do not delete.

            Flight constraints (binding)

            • ONE draft PR, first line Fixes #<this card>; governed (skills/** md) ⇒ 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; scripts/check-skills-token-ratchet.mjs touched ONLY to drop the row of a file this PR deletes.
            • ⛔ Never edit another package's files: MERGE-INTO another package = DELETE here + one-line pointer; a missing/weaker anchor goes in the PR body under "follow-up for ".
            • Generated files untouched (references/_index.md); frontmatter edits ⇒ regenerate skills/README.md (pnpm --filter @objectstack/spec gen:skill-docs).
            • Live surface with zero measured usage ⇒ one row pointing at its schema, never delete the last mention; retired/tombstoned surface ⇒ delete.
            • A false claim matching a spec .describe() string ⇒ file the spec-side twin as an out-of-scope 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 list keyed by finding id; per-file token delta; needs:contract-review on both carriers if any operator/contract-semantics claim changes (INC-01 does).

            Refs: #14292 · #14296 (batch-1 decisions) · #13658 (truth sweep).

            Activity

            Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

            Metadata

            Metadata

            Assignees

            Labels

            documentationImprovements or additions to documentationdomain:skillspriority:p1High: required for production / M2

            Type

            No type

            Projects

            No projects

              Milestone

              No milestone

              Relationships

              None yet

              Development

              No branches or pull requests

              Issue actions

              , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
              Skip to content

              Skills optimization flight — skills/objectstack-data: RESTRUCTURE (≈ −10,150 tok, −22%) — hooks taught twice across two files, generic-JS patterns, 3.3% example gate coverage, sharingModel used by 31/31 objects and explained nowhere #14297

              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/maina59f78d (skills/** byte-identical at d63c8a2); 43 findings DATA-A-01 … DATA-I-04. The full findings table is the audit record: the dev posts it verbatim as the first comment on this card at claim time (source: the seat container's scratchpad audit/objectstack-data/findings.md).

              Audit summary

              12 files, 4,942 lines, 45,780 hand-authored tokens (+1,483 generated) = 25.2% of the published catalog, 29% larger than the next package; total headroom across 10 ratcheted files: 47 tokens, five at 0. Real usage (examples/** + packages/apps/**): 31 ObjectSchema.create() calls in 26 object files, ~250 Field.* calls vs 22 literals (92% factory), 3 defineSeed modules, 2 hook files, 2 datasource files, 0 *.seed.ts. All 9 patterns with ≥3 real usages are covered; 8 documented surfaces have zero corpus usage; two high-frequency keys have no coverage at all. Verdict RESTRUCTURE: hooks (14,779 tok, 32% of the package) are split across rules/hooks.md and references/data-hooks.md where the second calls itself a pointer and then restates five sections; the rules/ routing table is buried at line 312 of 1,216; the package holds 41% of the catalog's TypeScript (151 fences) with 3.3% os:check coverage — seven unmarked self-contained blocks would fail check-skill-examples today.

              Top findings (token-delta × confidence)

              idspanproposalΔtok
              DATA-B-01 / I-03rules/hooks.md (whole) ∥ references/data-hooks.mdMERGE-INTO one file — hooks.md:3 calls itself "a reference pointer", then restates 5 sections−1,880
              DATA-D-04references/data-hooks.md:765-1046DELETE patterns 1,2,4,5,7,9 (generic JS); keep 3,6,8,10−1,000
              DATA-C-05SKILL.md:858-971REWRITE-AS-CONSTRUCT — 3 near-identical examples + Studio-banner narration for a 4-value enum; 0 corpus uses−600
              DATA-B-04references/data-hooks.md:1050-1133DELETE — "Registration, three methods" also at rules/hooks.md:145-176−566
              DATA-D-11rules/naming.md:15-93, 103-107DELETE — 6 ❌/✅ pairs + rationale for a rule the regex at :9 already states−566
              DATA-D-06rules/indexing.md:161-234REWRITE-AS-CONSTRUCT — one textbook fact (left-to-right) in 3 subsections−480
              DATA-B-03rules/hooks.md:99-126data-hooks.md:41-70DELETE one copy of the 8-event table−466
              DATA-C-0425 tombstone sitesDELETE standalone blocks — each key is refused by a parse error carrying its own prescription; objectstack-upgrade owns this−450
              DATA-C-03references/data-hooks.md:1209-1275DELETE — vitest + LiteKernel harnesses; platform's frontmatter claims that surface−432
              DATA-D-07rules/indexing.md:277-298, 312-340DELETE — unsourced Table Size → Max Indexes table, pg_stat_user_indexes SQL, 10 best-practices−430
              DATA-B-05references/data-hooks.md:1136-1160DELETE — DO/DON'T also at rules/hooks.md:180-194−418
              DATA-D-12SKILL.md:540-555DELETE — "CRM Schema Blueprint" points at 6 things covered above it−358
              DATA-C-01SKILL.md:162-189DELETE — two verbatim CLI/HTTP error transcripts; the 400 text is word-for-word in objectstack-query−343
              DATA-D-09rules/validation.md:420-438DELETE — best-practices + unsourced perf claims−338
              DATA-D-01/02/03references/data-hooks.md:1279-1444DELETE — invented benchmark table, "Advanced Topics" (a for loop), Troubleshooting, Summary−990

              Net after +825 of paid additions ≈ −10,150 tokens (−22.2%), touching none of the 9 live patterns.

              Incidental falsehoods (fix in this flight)

              • INC-01 SKILL.md:393required: true → false "dev auto-heals (autoMigrate:'safe')". Nullability drift is compared against storage.notNull, NOT required (packages/drivers/driver-sql/src/schema-drift.ts:795-798; field.zod.tsrequired.describe()), and the emitted op is severity: 'warning', category: 'needs_confirm', op: 'relax_not_null' — never auto-applied. HIGH.
              • INC-02 SKILL.md:398-401 — the "stale NOT NULL column" 400 story: schema-drift.ts:800-802 says that configuration produces a raw driver error, not a clean validation 400. MED.

              Three funded additions

              1. sharingModel (DATA-F-01, +130, paid by DATA-C-05) — used by 31/31 real objects, absent from both property tables; an object publish with no authored sharingModel is refused (security-owd-unset, packages/lint/src/validate-security-posture.ts:62).
              2. Field.* factory spelling in rules/field-types.md (DATA-E-03, +150, paid by DATA-D-14 + DATA-D-11) — the file whose job is field authoring contains zero Field.*; corpus is 92% factory.
              3. required vs storage.notNull (DATA-F-02, +60) and 4 security-lint rows (DATA-F-04, +90), paid by DATA-D-15 + DATA-D-13.

              Flight scope

              IMPLEMENT (same-file, shrink-only): every DELETE / MERGE-INTO / REWRITE-AS-CONSTRUCT row in the findings table at HIGH or MED confidence; the three funded additions; INC-01/INC-02 corrections; os:check markers on the top-traffic examples with the seven would-fail blocks repaired (DATA-E-01/03/05); the hooks consolidation — delete rules/hooks.md, keep references/data-hooks.md as the single hooks file with its unique content preserved and paid by the data-hooks deletions; drop the deleted file's ceiling row.

              ANCHOR RULINGS (this package is the anchor): objects, fields, relationships, hooks, seeds, datasources, permissions/RLS. Sibling flights (ui, api, platform, query, automation) delete their copies and point HERE — keep the paths rules/relationships.md, rules/datasources.md, rules/field-types.md, references/data-hooks.md stable. The inbound link rules/hooks.md:202 → objectstack-platform rules/plugin-hooks-events.md: the platform flight retires that file; re-point to objectstack-platform/references/plugin-hooks.md. DATA-C-03 (test harness) → delete + one-line pointer to objectstack-platform. DATA-C-01 → delete (query keeps its copy).

              DEFER (pending #14296): DATA-I-04 (new rules/security.md), DATA-H-01 (evals ceiling / stub), DATA-F-07 (defineHook() prescription — maintainer call; record as a follow-up in the PR body), DATA-F-05 retire-surface candidates → shrink to one schema-pointing row, do not delete.

              Flight constraints (binding)

              • ONE draft PR, first line Fixes #<this card>; governed (skills/** md) ⇒ 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; scripts/check-skills-token-ratchet.mjs touched ONLY to drop the row of a file this PR deletes.
              • ⛔ Never edit another package's files: MERGE-INTO another package = DELETE here + one-line pointer; a missing/weaker anchor goes in the PR body under "follow-up for ".
              • Generated files untouched (references/_index.md); frontmatter edits ⇒ regenerate skills/README.md (pnpm --filter @objectstack/spec gen:skill-docs).
              • Live surface with zero measured usage ⇒ one row pointing at its schema, never delete the last mention; retired/tombstoned surface ⇒ delete.
              • A false claim matching a spec .describe() string ⇒ file the spec-side twin as an out-of-scope 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 list keyed by finding id; per-file token delta; needs:contract-review on both carriers if any operator/contract-semantics claim changes (INC-01 does).

              Refs: #14292 · #14296 (batch-1 decisions) · #13658 (truth sweep).

              Activity

              Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

              Metadata

              Metadata

              Assignees

              Labels

              documentationImprovements or additions to documentationdomain:skillspriority:p1High: required for production / M2

              Type

              No type

              Projects

              No projects

                Milestone

                No milestone

                Relationships

                None yet

                Development

                No branches or pull requests

                Issue actions

                , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
                Skip to content

                Skills optimization flight — skills/objectstack-data: RESTRUCTURE (≈ −10,150 tok, −22%) — hooks taught twice across two files, generic-JS patterns, 3.3% example gate coverage, sharingModel used by 31/31 objects and explained nowhere #14297

                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/maina59f78d (skills/** byte-identical at d63c8a2); 43 findings DATA-A-01 … DATA-I-04. The full findings table is the audit record: the dev posts it verbatim as the first comment on this card at claim time (source: the seat container's scratchpad audit/objectstack-data/findings.md).

                Audit summary

                12 files, 4,942 lines, 45,780 hand-authored tokens (+1,483 generated) = 25.2% of the published catalog, 29% larger than the next package; total headroom across 10 ratcheted files: 47 tokens, five at 0. Real usage (examples/** + packages/apps/**): 31 ObjectSchema.create() calls in 26 object files, ~250 Field.* calls vs 22 literals (92% factory), 3 defineSeed modules, 2 hook files, 2 datasource files, 0 *.seed.ts. All 9 patterns with ≥3 real usages are covered; 8 documented surfaces have zero corpus usage; two high-frequency keys have no coverage at all. Verdict RESTRUCTURE: hooks (14,779 tok, 32% of the package) are split across rules/hooks.md and references/data-hooks.md where the second calls itself a pointer and then restates five sections; the rules/ routing table is buried at line 312 of 1,216; the package holds 41% of the catalog's TypeScript (151 fences) with 3.3% os:check coverage — seven unmarked self-contained blocks would fail check-skill-examples today.

                Top findings (token-delta × confidence)

                idspanproposalΔtok
                DATA-B-01 / I-03rules/hooks.md (whole) ∥ references/data-hooks.mdMERGE-INTO one file — hooks.md:3 calls itself "a reference pointer", then restates 5 sections−1,880
                DATA-D-04references/data-hooks.md:765-1046DELETE patterns 1,2,4,5,7,9 (generic JS); keep 3,6,8,10−1,000
                DATA-C-05SKILL.md:858-971REWRITE-AS-CONSTRUCT — 3 near-identical examples + Studio-banner narration for a 4-value enum; 0 corpus uses−600
                DATA-B-04references/data-hooks.md:1050-1133DELETE — "Registration, three methods" also at rules/hooks.md:145-176−566
                DATA-D-11rules/naming.md:15-93, 103-107DELETE — 6 ❌/✅ pairs + rationale for a rule the regex at :9 already states−566
                DATA-D-06rules/indexing.md:161-234REWRITE-AS-CONSTRUCT — one textbook fact (left-to-right) in 3 subsections−480
                DATA-B-03rules/hooks.md:99-126data-hooks.md:41-70DELETE one copy of the 8-event table−466
                DATA-C-0425 tombstone sitesDELETE standalone blocks — each key is refused by a parse error carrying its own prescription; objectstack-upgrade owns this−450
                DATA-C-03references/data-hooks.md:1209-1275DELETE — vitest + LiteKernel harnesses; platform's frontmatter claims that surface−432
                DATA-D-07rules/indexing.md:277-298, 312-340DELETE — unsourced Table Size → Max Indexes table, pg_stat_user_indexes SQL, 10 best-practices−430
                DATA-B-05references/data-hooks.md:1136-1160DELETE — DO/DON'T also at rules/hooks.md:180-194−418
                DATA-D-12SKILL.md:540-555DELETE — "CRM Schema Blueprint" points at 6 things covered above it−358
                DATA-C-01SKILL.md:162-189DELETE — two verbatim CLI/HTTP error transcripts; the 400 text is word-for-word in objectstack-query−343
                DATA-D-09rules/validation.md:420-438DELETE — best-practices + unsourced perf claims−338
                DATA-D-01/02/03references/data-hooks.md:1279-1444DELETE — invented benchmark table, "Advanced Topics" (a for loop), Troubleshooting, Summary−990

                Net after +825 of paid additions ≈ −10,150 tokens (−22.2%), touching none of the 9 live patterns.

                Incidental falsehoods (fix in this flight)

                • INC-01 SKILL.md:393required: true → false "dev auto-heals (autoMigrate:'safe')". Nullability drift is compared against storage.notNull, NOT required (packages/drivers/driver-sql/src/schema-drift.ts:795-798; field.zod.tsrequired.describe()), and the emitted op is severity: 'warning', category: 'needs_confirm', op: 'relax_not_null' — never auto-applied. HIGH.
                • INC-02 SKILL.md:398-401 — the "stale NOT NULL column" 400 story: schema-drift.ts:800-802 says that configuration produces a raw driver error, not a clean validation 400. MED.

                Three funded additions

                1. sharingModel (DATA-F-01, +130, paid by DATA-C-05) — used by 31/31 real objects, absent from both property tables; an object publish with no authored sharingModel is refused (security-owd-unset, packages/lint/src/validate-security-posture.ts:62).
                2. Field.* factory spelling in rules/field-types.md (DATA-E-03, +150, paid by DATA-D-14 + DATA-D-11) — the file whose job is field authoring contains zero Field.*; corpus is 92% factory.
                3. required vs storage.notNull (DATA-F-02, +60) and 4 security-lint rows (DATA-F-04, +90), paid by DATA-D-15 + DATA-D-13.

                Flight scope

                IMPLEMENT (same-file, shrink-only): every DELETE / MERGE-INTO / REWRITE-AS-CONSTRUCT row in the findings table at HIGH or MED confidence; the three funded additions; INC-01/INC-02 corrections; os:check markers on the top-traffic examples with the seven would-fail blocks repaired (DATA-E-01/03/05); the hooks consolidation — delete rules/hooks.md, keep references/data-hooks.md as the single hooks file with its unique content preserved and paid by the data-hooks deletions; drop the deleted file's ceiling row.

                ANCHOR RULINGS (this package is the anchor): objects, fields, relationships, hooks, seeds, datasources, permissions/RLS. Sibling flights (ui, api, platform, query, automation) delete their copies and point HERE — keep the paths rules/relationships.md, rules/datasources.md, rules/field-types.md, references/data-hooks.md stable. The inbound link rules/hooks.md:202 → objectstack-platform rules/plugin-hooks-events.md: the platform flight retires that file; re-point to objectstack-platform/references/plugin-hooks.md. DATA-C-03 (test harness) → delete + one-line pointer to objectstack-platform. DATA-C-01 → delete (query keeps its copy).

                DEFER (pending #14296): DATA-I-04 (new rules/security.md), DATA-H-01 (evals ceiling / stub), DATA-F-07 (defineHook() prescription — maintainer call; record as a follow-up in the PR body), DATA-F-05 retire-surface candidates → shrink to one schema-pointing row, do not delete.

                Flight constraints (binding)

                • ONE draft PR, first line Fixes #<this card>; governed (skills/** md) ⇒ 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; scripts/check-skills-token-ratchet.mjs touched ONLY to drop the row of a file this PR deletes.
                • ⛔ Never edit another package's files: MERGE-INTO another package = DELETE here + one-line pointer; a missing/weaker anchor goes in the PR body under "follow-up for ".
                • Generated files untouched (references/_index.md); frontmatter edits ⇒ regenerate skills/README.md (pnpm --filter @objectstack/spec gen:skill-docs).
                • Live surface with zero measured usage ⇒ one row pointing at its schema, never delete the last mention; retired/tombstoned surface ⇒ delete.
                • A false claim matching a spec .describe() string ⇒ file the spec-side twin as an out-of-scope 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 list keyed by finding id; per-file token delta; needs:contract-review on both carriers if any operator/contract-semantics claim changes (INC-01 does).

                Refs: #14292 · #14296 (batch-1 decisions) · #13658 (truth sweep).

                Activity

                Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

                Metadata

                Metadata

                Assignees

                Labels

                documentationImprovements or additions to documentationdomain:skillspriority:p1High: required for production / M2

                Type

                No type

                Projects

                No projects

                  Milestone

                  No milestone

                  Relationships

                  None yet

                  Development

                  No branches or pull requests

                  Issue actions