Skip to content

docs(skills): land the app-repo working principles in the published catalog - #14052

Merged
os-zhuang merged 2 commits into
mainfrom
claude/issue-13848-app-principles-objectstack-half
Sep 1, 2026
Merged

docs(skills): land the app-repo working principles in the published catalog#14052
os-zhuang merged 2 commits into
mainfrom
claude/issue-13848-app-principles-objectstack-half

Conversation

@claude

@claudeclaudeBot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

Fixes#13848

Lands the objectstack half of the 2026-08-31 app-repo principles. The hotcrm half already landed (hotcrm PR 1438); this PR discharges the card's whole remaining range — the published-skills universal items and the pm-dispatch decision-analysis clause — so the card closes with it.

⛔ Human merge required — this PR raises five shrink-only token ceilings

Governed surface, draft only. The raise is ⛔ MAINTAINER-ONLY territory and is taken here because the ruling that authorizes it names this landing surface by name. Verbatim and untranslated, recorded on the card:

「元数据应用就应该是在平台的规范下,基于skills 写元数据,并且使用平台提供的os命令校验元数据的合法性,而不是重新造轮子。这个也应该进入 hotcrm 的规范,甚至是 objectstack 的skills」

and, for the escape-hatch ladder (same day):

「或者说 skills 应该说明,逃生仓是极端场景按照客户需求自定义的场景下才需要,应该尽量避免。」

The reviewer's call is whether 900 ceiling tokens is the right price for these principles. Everything else here is mechanical.

Landing map — where each item went, and why

The card's spec rows are domain-scoped, and published skills are loaded per domain, so each rule sits where the reader is at the moment the mistake is available — not collected into one section a data-schema author never loads.

Spec rowRuleLanded inAnchor
1App is a simplified business implementation: metadata under the spec, authored from skills, checked with os; capability gaps go upstreamskills/objectstack-platform/SKILL.mdnew section "The App / Platform Boundary"
2Platform defect means wait for the fix — no workaround, no half-landing; blocked-by; verify the pin and re-run the repro before resumingsame sectionsame
4A bad platform default is a default to fixsame sectionsame
5Docs explain business concepts, not hand-copied machine inventoriesskills/objectstack-ui/SKILL.mdDocs — Package Documentation, after the authoring rules
7Invariant vs transition gate: validations[] vs requiredWhen / boundsskills/objectstack-data/SKILL.mdthe field-conditional-rule bullet list, beside requiredWhen
8Blocking rests on a human judgement; no override escape hatchskills/objectstack-data/rules/validation.mdValidation Properties — Severity Levels
9Screen flow stays runAs: 'user'; elevated writes move into a subflowskills/objectstack-automation/SKILL.mdbeside the existing readonly blockquote
10A runAs: 'system' sweep pins an organization predicate; tenant column is platform-injectedsame filesame
Principle 5The section ladder: derive, then group reference, then hand enumeration lastskills/objectstack-ui/SKILL.mdRecord Presentation, beside "let the platform lay it out"
Clause ②App-repo exception to the recommendation order.claude/skills/pm-dispatch/references/decision-analysis.mdadjacent to the 四棱分歧推荐序 段

Row 9 corrects a real drift rather than only adding: the existing readonly blockquote says a flow maintaining a readonly field must run runAs: 'system'. True of the scheduled flow it was written for; read by an agent writing a screen flow it says "elevate the whole screen flow", which elevates every other write in it.

Principle 5 also required fixing the page that taught the rung it demotes: this file's two worked sections examples enumerated their members. Both now reference a declared group, which is what the ruling asks for and is also shorter.

Budgets — before / after

Token ratchet (node scripts/check-skills-token-ratchet.mjs), unit ceil(utf8 bytes / 4):

FileTokens beforeTokens afterGrowthCeiling beforeCeiling afterRaise
skills/objectstack-platform/SKILL.md1270412984+2801270512984+279
skills/objectstack-ui/SKILL.md2514325445+3022514325445+302
skills/objectstack-data/SKILL.md1378213892+1101378313892+109
skills/objectstack-data/rules/validation.md30243109+8530243109+85
skills/objectstack-automation/SKILL.md1261812768+1501264312768+125
Total+927+900

Growth exceeds the raise by 27 because three rows carried that much existing headroom, which is spent first. Whole shipped bundle: 186567 to 187494 tokens (+0.50 percent).

Paid down before raising: the only genuine deletion available was the two sections examples in the ui row, worth 13 tokens, and it is the fix the ruling asks for rather than a payment invented to fund the raise. Nothing else in these five files had text the new rules make redundant, so further funding would have meant deleting a live fact with no other home — the stop condition, not a budget.

The SKILL.md subtotal self-test pin shifts 118095 to 118910, exactly the 815 raised on the four SKILL.md rows (the fifth row is not a SKILL.md and correctly does not move it), so the id-strip's lowering claim keeps its original 80 tokens of slack. Same operation the 2026-08-27 pm-dispatch raise performed.

Line ratchet (node scripts/pm/check-skill-line-ratchet.mjs): decision-analysis.md stays 46 / 46 lines, no raise. The new clause is funded entirely by reflowing two paragraphs with the gate's own wrapLine, which frees exactly two lines. Widest-table-row pin unchanged at 0.

A regression this PR caused and fixed

The first commit put the authority block between the SHRINK-ONLY doc comment and export const CEILINGS, which pushed that testimony outside the 400-byte anchor window check-ratchet-remedy-authority.mjs searches around every CEILINGS mention. The farm-wide detector then classified the gate excluded instead of marked — MISCLASSIFIED, i.e. it reported that a gate had silently left the maintainer-only convention. Measured green on origin/main and red on the branch, so the regression was this PR's, not pre-existing. Second commit moves the block above the doc comment and records the constraint in place.

Worth noting for review: that gate is not in the family scripts/pm/dispatch-gates.mjs derives for these paths. It was run because a ratchet edit is exactly what it polices.

Verification

Gate union run after the final commit, at fa2a2ef70. Exit codes captured before any pipe (cmd > log 2>&1; EXIT=$?); each verdict read from the gate's own printed line.

36 gates run: the 32 the dispatch-gates family derives for this changeset (asserted with --repo objectstack-ai/objectstack), plus check:nul-bytes, check-skill-line-ratchet, the token ratchet's --self-test (64 cases), and check-ratchet-remedy-authority.

  • 34 green, including check:doc-authoring, check:corpus-claim-drift, check:skill-frame-sync, check:skill-compatibility, check:skill-identifier-liveness, check:role-word, check:pm-skill-id-lint, check:pm-skill-ratchet, check:pm-governed-merges, check:nul-bytes, both ratchets and both self-tests.
  • check:doc-formula-expressions needed @objectstack/formula and @objectstack/lint built first; after building both it is green (22 record-scoped examples, 9 spec TSDoc examples, 14 field-level predicates, all clean).
  • check-test-completeness is NOT MEASURED locally, by construction: it parses a test-run log, the derived family names it with no argument, and the gate itself prints that this branch is unreachable in CI and is not a red. CI is authoritative for it.

Changeset

None, per the three immediate precedents for skills-only PRs on this surface (PRs 14001, 13972, 13891 — none carried one). skip-changeset label applied at PR open.

Out of scope

No hotcrm files, no content/docs/releases/, no pm-dispatch SKILL.md main-file growth. The nav-item-type rows of card 13890 are a different card queued behind this one on the ui SKILL.md face and are not touched here.

Generated by Claude Code


Generated by Claude Code

…atalog
Encode the maintainer's 2026-08-31 metadata-app principles on the surface the
ruling names — the published `skills/` catalog — plus the PM decision-analysis
recommendation-order clause they imply.
- platform: a new "App / Platform Boundary" section — what an app IS, where a
capability gap gets fixed, and what a platform defect obliges (wait for the
fix; no workaround, no half-landing; verify the pin and re-run the repro
before resuming).
- ui: the section escape-hatch ladder (derive -> group reference -> hand
enumeration, last) in Record Presentation, and the docs rule that a doc
explains business concepts rather than hand-copying a machine inventory. The
file's two worked `sections` examples now reference a declared group instead
of enumerating members, so the page stops teaching the rung it demotes.
- data: the invariant-vs-transition-gate choice beside `requiredWhen`, and
blocking-rests-on-a-human-judgement beside the severity levels.
- automation: keep a screen flow at `runAs: 'user'` and move an elevated write
into a `subflow`; pin an organization predicate on a `runAs: 'system'` sweep.
- pm-dispatch decision-analysis: the app-repo exception to the recommendation
order, funded entirely by reflow within the file's 46-line ceiling.
Token ceilings rise by 900 across five rows under the ruling quoted verbatim in
the CEILINGS block; the SKILL.md subtotal pin shifts by the same amount so the
id-strip's lowering claim keeps its original slack.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Msg17tAHJ3jVTYFgHydCm2
…laration
The authority block added by the previous commit sat between the `SHRINK-ONLY`
doc comment and `export const CEILINGS`, pushing that testimony outside the
400-char anchor window check-ratchet-remedy-authority.mjs searches around every
`CEILINGS` mention. The sweep then classified this gate `excluded` instead of
`marked` — a MISCLASSIFIED failure, the farm reporting that a gate had silently
left the maintainer-only convention. Measured green on origin/main and red on
the branch, so the regression was this PR's.
Move the block above the doc comment, restoring adjacency, and record the
constraint where the next author will hit it.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Msg17tAHJ3jVTYFgHydCm2
@os-zhuang
os-zhuang marked this pull request as ready for review September 1, 2026 06:33
@os-zhuang
os-zhuang added this pull request to the merge queueSep 1, 2026
Merged via the queue into main with commit e4916fcSep 1, 2026
34 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-13848-app-principles-objectstack-half branch September 1, 2026 06:54
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/mskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants

@os-zhuang@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
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;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
docs(skills): land the app-repo working principles in the published catalog by claude[bot] · Pull Request #14052 · objectstack-ai/objectstack · GitHub
Skip to content

docs(skills): land the app-repo working principles in the published catalog - #14052

Merged
os-zhuang merged 2 commits into
mainfrom
claude/issue-13848-app-principles-objectstack-half
Sep 1, 2026
Merged

docs(skills): land the app-repo working principles in the published catalog#14052
os-zhuang merged 2 commits into
mainfrom
claude/issue-13848-app-principles-objectstack-half

Conversation

@claude

@claudeclaudeBot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

Fixes#13848

Lands the objectstack half of the 2026-08-31 app-repo principles. The hotcrm half already landed (hotcrm PR 1438); this PR discharges the card's whole remaining range — the published-skills universal items and the pm-dispatch decision-analysis clause — so the card closes with it.

⛔ Human merge required — this PR raises five shrink-only token ceilings

Governed surface, draft only. The raise is ⛔ MAINTAINER-ONLY territory and is taken here because the ruling that authorizes it names this landing surface by name. Verbatim and untranslated, recorded on the card:

「元数据应用就应该是在平台的规范下,基于skills 写元数据,并且使用平台提供的os命令校验元数据的合法性,而不是重新造轮子。这个也应该进入 hotcrm 的规范,甚至是 objectstack 的skills」

and, for the escape-hatch ladder (same day):

「或者说 skills 应该说明,逃生仓是极端场景按照客户需求自定义的场景下才需要,应该尽量避免。」

The reviewer's call is whether 900 ceiling tokens is the right price for these principles. Everything else here is mechanical.

Landing map — where each item went, and why

The card's spec rows are domain-scoped, and published skills are loaded per domain, so each rule sits where the reader is at the moment the mistake is available — not collected into one section a data-schema author never loads.

Spec rowRuleLanded inAnchor
1App is a simplified business implementation: metadata under the spec, authored from skills, checked with os; capability gaps go upstreamskills/objectstack-platform/SKILL.mdnew section "The App / Platform Boundary"
2Platform defect means wait for the fix — no workaround, no half-landing; blocked-by; verify the pin and re-run the repro before resumingsame sectionsame
4A bad platform default is a default to fixsame sectionsame
5Docs explain business concepts, not hand-copied machine inventoriesskills/objectstack-ui/SKILL.mdDocs — Package Documentation, after the authoring rules
7Invariant vs transition gate: validations[] vs requiredWhen / boundsskills/objectstack-data/SKILL.mdthe field-conditional-rule bullet list, beside requiredWhen
8Blocking rests on a human judgement; no override escape hatchskills/objectstack-data/rules/validation.mdValidation Properties — Severity Levels
9Screen flow stays runAs: 'user'; elevated writes move into a subflowskills/objectstack-automation/SKILL.mdbeside the existing readonly blockquote
10A runAs: 'system' sweep pins an organization predicate; tenant column is platform-injectedsame filesame
Principle 5The section ladder: derive, then group reference, then hand enumeration lastskills/objectstack-ui/SKILL.mdRecord Presentation, beside "let the platform lay it out"
Clause ②App-repo exception to the recommendation order.claude/skills/pm-dispatch/references/decision-analysis.mdadjacent to the 四棱分歧推荐序 段

Row 9 corrects a real drift rather than only adding: the existing readonly blockquote says a flow maintaining a readonly field must run runAs: 'system'. True of the scheduled flow it was written for; read by an agent writing a screen flow it says "elevate the whole screen flow", which elevates every other write in it.

Principle 5 also required fixing the page that taught the rung it demotes: this file's two worked sections examples enumerated their members. Both now reference a declared group, which is what the ruling asks for and is also shorter.

Budgets — before / after

Token ratchet (node scripts/check-skills-token-ratchet.mjs), unit ceil(utf8 bytes / 4):

FileTokens beforeTokens afterGrowthCeiling beforeCeiling afterRaise
skills/objectstack-platform/SKILL.md1270412984+2801270512984+279
skills/objectstack-ui/SKILL.md2514325445+3022514325445+302
skills/objectstack-data/SKILL.md1378213892+1101378313892+109
skills/objectstack-data/rules/validation.md30243109+8530243109+85
skills/objectstack-automation/SKILL.md1261812768+1501264312768+125
Total+927+900

Growth exceeds the raise by 27 because three rows carried that much existing headroom, which is spent first. Whole shipped bundle: 186567 to 187494 tokens (+0.50 percent).

Paid down before raising: the only genuine deletion available was the two sections examples in the ui row, worth 13 tokens, and it is the fix the ruling asks for rather than a payment invented to fund the raise. Nothing else in these five files had text the new rules make redundant, so further funding would have meant deleting a live fact with no other home — the stop condition, not a budget.

The SKILL.md subtotal self-test pin shifts 118095 to 118910, exactly the 815 raised on the four SKILL.md rows (the fifth row is not a SKILL.md and correctly does not move it), so the id-strip's lowering claim keeps its original 80 tokens of slack. Same operation the 2026-08-27 pm-dispatch raise performed.

Line ratchet (node scripts/pm/check-skill-line-ratchet.mjs): decision-analysis.md stays 46 / 46 lines, no raise. The new clause is funded entirely by reflowing two paragraphs with the gate's own wrapLine, which frees exactly two lines. Widest-table-row pin unchanged at 0.

A regression this PR caused and fixed

The first commit put the authority block between the SHRINK-ONLY doc comment and export const CEILINGS, which pushed that testimony outside the 400-byte anchor window check-ratchet-remedy-authority.mjs searches around every CEILINGS mention. The farm-wide detector then classified the gate excluded instead of marked — MISCLASSIFIED, i.e. it reported that a gate had silently left the maintainer-only convention. Measured green on origin/main and red on the branch, so the regression was this PR's, not pre-existing. Second commit moves the block above the doc comment and records the constraint in place.

Worth noting for review: that gate is not in the family scripts/pm/dispatch-gates.mjs derives for these paths. It was run because a ratchet edit is exactly what it polices.

Verification

Gate union run after the final commit, at fa2a2ef70. Exit codes captured before any pipe (cmd > log 2>&1; EXIT=$?); each verdict read from the gate's own printed line.

36 gates run: the 32 the dispatch-gates family derives for this changeset (asserted with --repo objectstack-ai/objectstack), plus check:nul-bytes, check-skill-line-ratchet, the token ratchet's --self-test (64 cases), and check-ratchet-remedy-authority.

  • 34 green, including check:doc-authoring, check:corpus-claim-drift, check:skill-frame-sync, check:skill-compatibility, check:skill-identifier-liveness, check:role-word, check:pm-skill-id-lint, check:pm-skill-ratchet, check:pm-governed-merges, check:nul-bytes, both ratchets and both self-tests.
  • check:doc-formula-expressions needed @objectstack/formula and @objectstack/lint built first; after building both it is green (22 record-scoped examples, 9 spec TSDoc examples, 14 field-level predicates, all clean).
  • check-test-completeness is NOT MEASURED locally, by construction: it parses a test-run log, the derived family names it with no argument, and the gate itself prints that this branch is unreachable in CI and is not a red. CI is authoritative for it.

Changeset

None, per the three immediate precedents for skills-only PRs on this surface (PRs 14001, 13972, 13891 — none carried one). skip-changeset label applied at PR open.

Out of scope

No hotcrm files, no content/docs/releases/, no pm-dispatch SKILL.md main-file growth. The nav-item-type rows of card 13890 are a different card queued behind this one on the ui SKILL.md face and are not touched here.

Generated by Claude Code


Generated by Claude Code

…atalog
Encode the maintainer's 2026-08-31 metadata-app principles on the surface the
ruling names — the published `skills/` catalog — plus the PM decision-analysis
recommendation-order clause they imply.
- platform: a new "App / Platform Boundary" section — what an app IS, where a
capability gap gets fixed, and what a platform defect obliges (wait for the
fix; no workaround, no half-landing; verify the pin and re-run the repro
before resuming).
- ui: the section escape-hatch ladder (derive -> group reference -> hand
enumeration, last) in Record Presentation, and the docs rule that a doc
explains business concepts rather than hand-copying a machine inventory. The
file's two worked `sections` examples now reference a declared group instead
of enumerating members, so the page stops teaching the rung it demotes.
- data: the invariant-vs-transition-gate choice beside `requiredWhen`, and
blocking-rests-on-a-human-judgement beside the severity levels.
- automation: keep a screen flow at `runAs: 'user'` and move an elevated write
into a `subflow`; pin an organization predicate on a `runAs: 'system'` sweep.
- pm-dispatch decision-analysis: the app-repo exception to the recommendation
order, funded entirely by reflow within the file's 46-line ceiling.
Token ceilings rise by 900 across five rows under the ruling quoted verbatim in
the CEILINGS block; the SKILL.md subtotal pin shifts by the same amount so the
id-strip's lowering claim keeps its original slack.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Msg17tAHJ3jVTYFgHydCm2
…laration
The authority block added by the previous commit sat between the `SHRINK-ONLY`
doc comment and `export const CEILINGS`, pushing that testimony outside the
400-char anchor window check-ratchet-remedy-authority.mjs searches around every
`CEILINGS` mention. The sweep then classified this gate `excluded` instead of
`marked` — a MISCLASSIFIED failure, the farm reporting that a gate had silently
left the maintainer-only convention. Measured green on origin/main and red on
the branch, so the regression was this PR's.
Move the block above the doc comment, restoring adjacency, and record the
constraint where the next author will hit it.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Msg17tAHJ3jVTYFgHydCm2
@os-zhuang
os-zhuang marked this pull request as ready for review September 1, 2026 06:33
@os-zhuang
os-zhuang added this pull request to the merge queueSep 1, 2026
Merged via the queue into main with commit e4916fcSep 1, 2026
34 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-13848-app-principles-objectstack-half branch September 1, 2026 06:54
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/mskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants

@os-zhuang@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' docs(skills): land the app-repo working principles in the published catalog by claude[bot] · Pull Request #14052 · objectstack-ai/objectstack · GitHub
Skip to content

docs(skills): land the app-repo working principles in the published catalog - #14052

Merged
os-zhuang merged 2 commits into
mainfrom
claude/issue-13848-app-principles-objectstack-half
Sep 1, 2026
Merged

docs(skills): land the app-repo working principles in the published catalog#14052
os-zhuang merged 2 commits into
mainfrom
claude/issue-13848-app-principles-objectstack-half

Conversation

@claude

@claudeclaudeBot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

Fixes#13848

Lands the objectstack half of the 2026-08-31 app-repo principles. The hotcrm half already landed (hotcrm PR 1438); this PR discharges the card's whole remaining range — the published-skills universal items and the pm-dispatch decision-analysis clause — so the card closes with it.

⛔ Human merge required — this PR raises five shrink-only token ceilings

Governed surface, draft only. The raise is ⛔ MAINTAINER-ONLY territory and is taken here because the ruling that authorizes it names this landing surface by name. Verbatim and untranslated, recorded on the card:

「元数据应用就应该是在平台的规范下,基于skills 写元数据,并且使用平台提供的os命令校验元数据的合法性,而不是重新造轮子。这个也应该进入 hotcrm 的规范,甚至是 objectstack 的skills」

and, for the escape-hatch ladder (same day):

「或者说 skills 应该说明,逃生仓是极端场景按照客户需求自定义的场景下才需要,应该尽量避免。」

The reviewer's call is whether 900 ceiling tokens is the right price for these principles. Everything else here is mechanical.

Landing map — where each item went, and why

The card's spec rows are domain-scoped, and published skills are loaded per domain, so each rule sits where the reader is at the moment the mistake is available — not collected into one section a data-schema author never loads.

Spec rowRuleLanded inAnchor
1App is a simplified business implementation: metadata under the spec, authored from skills, checked with os; capability gaps go upstreamskills/objectstack-platform/SKILL.mdnew section "The App / Platform Boundary"
2Platform defect means wait for the fix — no workaround, no half-landing; blocked-by; verify the pin and re-run the repro before resumingsame sectionsame
4A bad platform default is a default to fixsame sectionsame
5Docs explain business concepts, not hand-copied machine inventoriesskills/objectstack-ui/SKILL.mdDocs — Package Documentation, after the authoring rules
7Invariant vs transition gate: validations[] vs requiredWhen / boundsskills/objectstack-data/SKILL.mdthe field-conditional-rule bullet list, beside requiredWhen
8Blocking rests on a human judgement; no override escape hatchskills/objectstack-data/rules/validation.mdValidation Properties — Severity Levels
9Screen flow stays runAs: 'user'; elevated writes move into a subflowskills/objectstack-automation/SKILL.mdbeside the existing readonly blockquote
10A runAs: 'system' sweep pins an organization predicate; tenant column is platform-injectedsame filesame
Principle 5The section ladder: derive, then group reference, then hand enumeration lastskills/objectstack-ui/SKILL.mdRecord Presentation, beside "let the platform lay it out"
Clause ②App-repo exception to the recommendation order.claude/skills/pm-dispatch/references/decision-analysis.mdadjacent to the 四棱分歧推荐序 段

Row 9 corrects a real drift rather than only adding: the existing readonly blockquote says a flow maintaining a readonly field must run runAs: 'system'. True of the scheduled flow it was written for; read by an agent writing a screen flow it says "elevate the whole screen flow", which elevates every other write in it.

Principle 5 also required fixing the page that taught the rung it demotes: this file's two worked sections examples enumerated their members. Both now reference a declared group, which is what the ruling asks for and is also shorter.

Budgets — before / after

Token ratchet (node scripts/check-skills-token-ratchet.mjs), unit ceil(utf8 bytes / 4):

FileTokens beforeTokens afterGrowthCeiling beforeCeiling afterRaise
skills/objectstack-platform/SKILL.md1270412984+2801270512984+279
skills/objectstack-ui/SKILL.md2514325445+3022514325445+302
skills/objectstack-data/SKILL.md1378213892+1101378313892+109
skills/objectstack-data/rules/validation.md30243109+8530243109+85
skills/objectstack-automation/SKILL.md1261812768+1501264312768+125
Total+927+900

Growth exceeds the raise by 27 because three rows carried that much existing headroom, which is spent first. Whole shipped bundle: 186567 to 187494 tokens (+0.50 percent).

Paid down before raising: the only genuine deletion available was the two sections examples in the ui row, worth 13 tokens, and it is the fix the ruling asks for rather than a payment invented to fund the raise. Nothing else in these five files had text the new rules make redundant, so further funding would have meant deleting a live fact with no other home — the stop condition, not a budget.

The SKILL.md subtotal self-test pin shifts 118095 to 118910, exactly the 815 raised on the four SKILL.md rows (the fifth row is not a SKILL.md and correctly does not move it), so the id-strip's lowering claim keeps its original 80 tokens of slack. Same operation the 2026-08-27 pm-dispatch raise performed.

Line ratchet (node scripts/pm/check-skill-line-ratchet.mjs): decision-analysis.md stays 46 / 46 lines, no raise. The new clause is funded entirely by reflowing two paragraphs with the gate's own wrapLine, which frees exactly two lines. Widest-table-row pin unchanged at 0.

A regression this PR caused and fixed

The first commit put the authority block between the SHRINK-ONLY doc comment and export const CEILINGS, which pushed that testimony outside the 400-byte anchor window check-ratchet-remedy-authority.mjs searches around every CEILINGS mention. The farm-wide detector then classified the gate excluded instead of marked — MISCLASSIFIED, i.e. it reported that a gate had silently left the maintainer-only convention. Measured green on origin/main and red on the branch, so the regression was this PR's, not pre-existing. Second commit moves the block above the doc comment and records the constraint in place.

Worth noting for review: that gate is not in the family scripts/pm/dispatch-gates.mjs derives for these paths. It was run because a ratchet edit is exactly what it polices.

Verification

Gate union run after the final commit, at fa2a2ef70. Exit codes captured before any pipe (cmd > log 2>&1; EXIT=$?); each verdict read from the gate's own printed line.

36 gates run: the 32 the dispatch-gates family derives for this changeset (asserted with --repo objectstack-ai/objectstack), plus check:nul-bytes, check-skill-line-ratchet, the token ratchet's --self-test (64 cases), and check-ratchet-remedy-authority.

  • 34 green, including check:doc-authoring, check:corpus-claim-drift, check:skill-frame-sync, check:skill-compatibility, check:skill-identifier-liveness, check:role-word, check:pm-skill-id-lint, check:pm-skill-ratchet, check:pm-governed-merges, check:nul-bytes, both ratchets and both self-tests.
  • check:doc-formula-expressions needed @objectstack/formula and @objectstack/lint built first; after building both it is green (22 record-scoped examples, 9 spec TSDoc examples, 14 field-level predicates, all clean).
  • check-test-completeness is NOT MEASURED locally, by construction: it parses a test-run log, the derived family names it with no argument, and the gate itself prints that this branch is unreachable in CI and is not a red. CI is authoritative for it.

Changeset

None, per the three immediate precedents for skills-only PRs on this surface (PRs 14001, 13972, 13891 — none carried one). skip-changeset label applied at PR open.

Out of scope

No hotcrm files, no content/docs/releases/, no pm-dispatch SKILL.md main-file growth. The nav-item-type rows of card 13890 are a different card queued behind this one on the ui SKILL.md face and are not touched here.

Generated by Claude Code


Generated by Claude Code

…atalog
Encode the maintainer's 2026-08-31 metadata-app principles on the surface the
ruling names — the published `skills/` catalog — plus the PM decision-analysis
recommendation-order clause they imply.
- platform: a new "App / Platform Boundary" section — what an app IS, where a
capability gap gets fixed, and what a platform defect obliges (wait for the
fix; no workaround, no half-landing; verify the pin and re-run the repro
before resuming).
- ui: the section escape-hatch ladder (derive -> group reference -> hand
enumeration, last) in Record Presentation, and the docs rule that a doc
explains business concepts rather than hand-copying a machine inventory. The
file's two worked `sections` examples now reference a declared group instead
of enumerating members, so the page stops teaching the rung it demotes.
- data: the invariant-vs-transition-gate choice beside `requiredWhen`, and
blocking-rests-on-a-human-judgement beside the severity levels.
- automation: keep a screen flow at `runAs: 'user'` and move an elevated write
into a `subflow`; pin an organization predicate on a `runAs: 'system'` sweep.
- pm-dispatch decision-analysis: the app-repo exception to the recommendation
order, funded entirely by reflow within the file's 46-line ceiling.
Token ceilings rise by 900 across five rows under the ruling quoted verbatim in
the CEILINGS block; the SKILL.md subtotal pin shifts by the same amount so the
id-strip's lowering claim keeps its original slack.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Msg17tAHJ3jVTYFgHydCm2
…laration
The authority block added by the previous commit sat between the `SHRINK-ONLY`
doc comment and `export const CEILINGS`, pushing that testimony outside the
400-char anchor window check-ratchet-remedy-authority.mjs searches around every
`CEILINGS` mention. The sweep then classified this gate `excluded` instead of
`marked` — a MISCLASSIFIED failure, the farm reporting that a gate had silently
left the maintainer-only convention. Measured green on origin/main and red on
the branch, so the regression was this PR's.
Move the block above the doc comment, restoring adjacency, and record the
constraint where the next author will hit it.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Msg17tAHJ3jVTYFgHydCm2
@os-zhuang
os-zhuang marked this pull request as ready for review September 1, 2026 06:33
@os-zhuang
os-zhuang added this pull request to the merge queueSep 1, 2026
Merged via the queue into main with commit e4916fcSep 1, 2026
34 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-13848-app-principles-objectstack-half branch September 1, 2026 06:54
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/mskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants

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

docs(skills): land the app-repo working principles in the published catalog - #14052

Merged
os-zhuang merged 2 commits into
mainfrom
claude/issue-13848-app-principles-objectstack-half
Sep 1, 2026
Merged

docs(skills): land the app-repo working principles in the published catalog#14052
os-zhuang merged 2 commits into
mainfrom
claude/issue-13848-app-principles-objectstack-half

Conversation

@claude

@claudeclaudeBot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

Fixes#13848

Lands the objectstack half of the 2026-08-31 app-repo principles. The hotcrm half already landed (hotcrm PR 1438); this PR discharges the card's whole remaining range — the published-skills universal items and the pm-dispatch decision-analysis clause — so the card closes with it.

⛔ Human merge required — this PR raises five shrink-only token ceilings

Governed surface, draft only. The raise is ⛔ MAINTAINER-ONLY territory and is taken here because the ruling that authorizes it names this landing surface by name. Verbatim and untranslated, recorded on the card:

「元数据应用就应该是在平台的规范下,基于skills 写元数据,并且使用平台提供的os命令校验元数据的合法性,而不是重新造轮子。这个也应该进入 hotcrm 的规范,甚至是 objectstack 的skills」

and, for the escape-hatch ladder (same day):

「或者说 skills 应该说明,逃生仓是极端场景按照客户需求自定义的场景下才需要,应该尽量避免。」

The reviewer's call is whether 900 ceiling tokens is the right price for these principles. Everything else here is mechanical.

Landing map — where each item went, and why

The card's spec rows are domain-scoped, and published skills are loaded per domain, so each rule sits where the reader is at the moment the mistake is available — not collected into one section a data-schema author never loads.

Spec rowRuleLanded inAnchor
1App is a simplified business implementation: metadata under the spec, authored from skills, checked with os; capability gaps go upstreamskills/objectstack-platform/SKILL.mdnew section "The App / Platform Boundary"
2Platform defect means wait for the fix — no workaround, no half-landing; blocked-by; verify the pin and re-run the repro before resumingsame sectionsame
4A bad platform default is a default to fixsame sectionsame
5Docs explain business concepts, not hand-copied machine inventoriesskills/objectstack-ui/SKILL.mdDocs — Package Documentation, after the authoring rules
7Invariant vs transition gate: validations[] vs requiredWhen / boundsskills/objectstack-data/SKILL.mdthe field-conditional-rule bullet list, beside requiredWhen
8Blocking rests on a human judgement; no override escape hatchskills/objectstack-data/rules/validation.mdValidation Properties — Severity Levels
9Screen flow stays runAs: 'user'; elevated writes move into a subflowskills/objectstack-automation/SKILL.mdbeside the existing readonly blockquote
10A runAs: 'system' sweep pins an organization predicate; tenant column is platform-injectedsame filesame
Principle 5The section ladder: derive, then group reference, then hand enumeration lastskills/objectstack-ui/SKILL.mdRecord Presentation, beside "let the platform lay it out"
Clause ②App-repo exception to the recommendation order.claude/skills/pm-dispatch/references/decision-analysis.mdadjacent to the 四棱分歧推荐序 段

Row 9 corrects a real drift rather than only adding: the existing readonly blockquote says a flow maintaining a readonly field must run runAs: 'system'. True of the scheduled flow it was written for; read by an agent writing a screen flow it says "elevate the whole screen flow", which elevates every other write in it.

Principle 5 also required fixing the page that taught the rung it demotes: this file's two worked sections examples enumerated their members. Both now reference a declared group, which is what the ruling asks for and is also shorter.

Budgets — before / after

Token ratchet (node scripts/check-skills-token-ratchet.mjs), unit ceil(utf8 bytes / 4):

FileTokens beforeTokens afterGrowthCeiling beforeCeiling afterRaise
skills/objectstack-platform/SKILL.md1270412984+2801270512984+279
skills/objectstack-ui/SKILL.md2514325445+3022514325445+302
skills/objectstack-data/SKILL.md1378213892+1101378313892+109
skills/objectstack-data/rules/validation.md30243109+8530243109+85
skills/objectstack-automation/SKILL.md1261812768+1501264312768+125
Total+927+900

Growth exceeds the raise by 27 because three rows carried that much existing headroom, which is spent first. Whole shipped bundle: 186567 to 187494 tokens (+0.50 percent).

Paid down before raising: the only genuine deletion available was the two sections examples in the ui row, worth 13 tokens, and it is the fix the ruling asks for rather than a payment invented to fund the raise. Nothing else in these five files had text the new rules make redundant, so further funding would have meant deleting a live fact with no other home — the stop condition, not a budget.

The SKILL.md subtotal self-test pin shifts 118095 to 118910, exactly the 815 raised on the four SKILL.md rows (the fifth row is not a SKILL.md and correctly does not move it), so the id-strip's lowering claim keeps its original 80 tokens of slack. Same operation the 2026-08-27 pm-dispatch raise performed.

Line ratchet (node scripts/pm/check-skill-line-ratchet.mjs): decision-analysis.md stays 46 / 46 lines, no raise. The new clause is funded entirely by reflowing two paragraphs with the gate's own wrapLine, which frees exactly two lines. Widest-table-row pin unchanged at 0.

A regression this PR caused and fixed

The first commit put the authority block between the SHRINK-ONLY doc comment and export const CEILINGS, which pushed that testimony outside the 400-byte anchor window check-ratchet-remedy-authority.mjs searches around every CEILINGS mention. The farm-wide detector then classified the gate excluded instead of marked — MISCLASSIFIED, i.e. it reported that a gate had silently left the maintainer-only convention. Measured green on origin/main and red on the branch, so the regression was this PR's, not pre-existing. Second commit moves the block above the doc comment and records the constraint in place.

Worth noting for review: that gate is not in the family scripts/pm/dispatch-gates.mjs derives for these paths. It was run because a ratchet edit is exactly what it polices.

Verification

Gate union run after the final commit, at fa2a2ef70. Exit codes captured before any pipe (cmd > log 2>&1; EXIT=$?); each verdict read from the gate's own printed line.

36 gates run: the 32 the dispatch-gates family derives for this changeset (asserted with --repo objectstack-ai/objectstack), plus check:nul-bytes, check-skill-line-ratchet, the token ratchet's --self-test (64 cases), and check-ratchet-remedy-authority.

  • 34 green, including check:doc-authoring, check:corpus-claim-drift, check:skill-frame-sync, check:skill-compatibility, check:skill-identifier-liveness, check:role-word, check:pm-skill-id-lint, check:pm-skill-ratchet, check:pm-governed-merges, check:nul-bytes, both ratchets and both self-tests.
  • check:doc-formula-expressions needed @objectstack/formula and @objectstack/lint built first; after building both it is green (22 record-scoped examples, 9 spec TSDoc examples, 14 field-level predicates, all clean).
  • check-test-completeness is NOT MEASURED locally, by construction: it parses a test-run log, the derived family names it with no argument, and the gate itself prints that this branch is unreachable in CI and is not a red. CI is authoritative for it.

Changeset

None, per the three immediate precedents for skills-only PRs on this surface (PRs 14001, 13972, 13891 — none carried one). skip-changeset label applied at PR open.

Out of scope

No hotcrm files, no content/docs/releases/, no pm-dispatch SKILL.md main-file growth. The nav-item-type rows of card 13890 are a different card queued behind this one on the ui SKILL.md face and are not touched here.

Generated by Claude Code


Generated by Claude Code

…atalog
Encode the maintainer's 2026-08-31 metadata-app principles on the surface the
ruling names — the published `skills/` catalog — plus the PM decision-analysis
recommendation-order clause they imply.
- platform: a new "App / Platform Boundary" section — what an app IS, where a
capability gap gets fixed, and what a platform defect obliges (wait for the
fix; no workaround, no half-landing; verify the pin and re-run the repro
before resuming).
- ui: the section escape-hatch ladder (derive -> group reference -> hand
enumeration, last) in Record Presentation, and the docs rule that a doc
explains business concepts rather than hand-copying a machine inventory. The
file's two worked `sections` examples now reference a declared group instead
of enumerating members, so the page stops teaching the rung it demotes.
- data: the invariant-vs-transition-gate choice beside `requiredWhen`, and
blocking-rests-on-a-human-judgement beside the severity levels.
- automation: keep a screen flow at `runAs: 'user'` and move an elevated write
into a `subflow`; pin an organization predicate on a `runAs: 'system'` sweep.
- pm-dispatch decision-analysis: the app-repo exception to the recommendation
order, funded entirely by reflow within the file's 46-line ceiling.
Token ceilings rise by 900 across five rows under the ruling quoted verbatim in
the CEILINGS block; the SKILL.md subtotal pin shifts by the same amount so the
id-strip's lowering claim keeps its original slack.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Msg17tAHJ3jVTYFgHydCm2
…laration
The authority block added by the previous commit sat between the `SHRINK-ONLY`
doc comment and `export const CEILINGS`, pushing that testimony outside the
400-char anchor window check-ratchet-remedy-authority.mjs searches around every
`CEILINGS` mention. The sweep then classified this gate `excluded` instead of
`marked` — a MISCLASSIFIED failure, the farm reporting that a gate had silently
left the maintainer-only convention. Measured green on origin/main and red on
the branch, so the regression was this PR's.
Move the block above the doc comment, restoring adjacency, and record the
constraint where the next author will hit it.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Msg17tAHJ3jVTYFgHydCm2
@os-zhuang
os-zhuang marked this pull request as ready for review September 1, 2026 06:33
@os-zhuang
os-zhuang added this pull request to the merge queueSep 1, 2026
Merged via the queue into main with commit e4916fcSep 1, 2026
34 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-13848-app-principles-objectstack-half branch September 1, 2026 06:54
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/mskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants

@os-zhuang@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' docs(skills): land the app-repo working principles in the published catalog by claude[bot] · Pull Request #14052 · objectstack-ai/objectstack · GitHub
Skip to content

docs(skills): land the app-repo working principles in the published catalog - #14052

Merged
os-zhuang merged 2 commits into
mainfrom
claude/issue-13848-app-principles-objectstack-half
Sep 1, 2026
Merged

docs(skills): land the app-repo working principles in the published catalog#14052
os-zhuang merged 2 commits into
mainfrom
claude/issue-13848-app-principles-objectstack-half

Conversation

@claude

@claudeclaudeBot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

Fixes#13848

Lands the objectstack half of the 2026-08-31 app-repo principles. The hotcrm half already landed (hotcrm PR 1438); this PR discharges the card's whole remaining range — the published-skills universal items and the pm-dispatch decision-analysis clause — so the card closes with it.

⛔ Human merge required — this PR raises five shrink-only token ceilings

Governed surface, draft only. The raise is ⛔ MAINTAINER-ONLY territory and is taken here because the ruling that authorizes it names this landing surface by name. Verbatim and untranslated, recorded on the card:

「元数据应用就应该是在平台的规范下,基于skills 写元数据,并且使用平台提供的os命令校验元数据的合法性,而不是重新造轮子。这个也应该进入 hotcrm 的规范,甚至是 objectstack 的skills」

and, for the escape-hatch ladder (same day):

「或者说 skills 应该说明,逃生仓是极端场景按照客户需求自定义的场景下才需要,应该尽量避免。」

The reviewer's call is whether 900 ceiling tokens is the right price for these principles. Everything else here is mechanical.

Landing map — where each item went, and why

The card's spec rows are domain-scoped, and published skills are loaded per domain, so each rule sits where the reader is at the moment the mistake is available — not collected into one section a data-schema author never loads.

Spec rowRuleLanded inAnchor
1App is a simplified business implementation: metadata under the spec, authored from skills, checked with os; capability gaps go upstreamskills/objectstack-platform/SKILL.mdnew section "The App / Platform Boundary"
2Platform defect means wait for the fix — no workaround, no half-landing; blocked-by; verify the pin and re-run the repro before resumingsame sectionsame
4A bad platform default is a default to fixsame sectionsame
5Docs explain business concepts, not hand-copied machine inventoriesskills/objectstack-ui/SKILL.mdDocs — Package Documentation, after the authoring rules
7Invariant vs transition gate: validations[] vs requiredWhen / boundsskills/objectstack-data/SKILL.mdthe field-conditional-rule bullet list, beside requiredWhen
8Blocking rests on a human judgement; no override escape hatchskills/objectstack-data/rules/validation.mdValidation Properties — Severity Levels
9Screen flow stays runAs: 'user'; elevated writes move into a subflowskills/objectstack-automation/SKILL.mdbeside the existing readonly blockquote
10A runAs: 'system' sweep pins an organization predicate; tenant column is platform-injectedsame filesame
Principle 5The section ladder: derive, then group reference, then hand enumeration lastskills/objectstack-ui/SKILL.mdRecord Presentation, beside "let the platform lay it out"
Clause ②App-repo exception to the recommendation order.claude/skills/pm-dispatch/references/decision-analysis.mdadjacent to the 四棱分歧推荐序 段

Row 9 corrects a real drift rather than only adding: the existing readonly blockquote says a flow maintaining a readonly field must run runAs: 'system'. True of the scheduled flow it was written for; read by an agent writing a screen flow it says "elevate the whole screen flow", which elevates every other write in it.

Principle 5 also required fixing the page that taught the rung it demotes: this file's two worked sections examples enumerated their members. Both now reference a declared group, which is what the ruling asks for and is also shorter.

Budgets — before / after

Token ratchet (node scripts/check-skills-token-ratchet.mjs), unit ceil(utf8 bytes / 4):

FileTokens beforeTokens afterGrowthCeiling beforeCeiling afterRaise
skills/objectstack-platform/SKILL.md1270412984+2801270512984+279
skills/objectstack-ui/SKILL.md2514325445+3022514325445+302
skills/objectstack-data/SKILL.md1378213892+1101378313892+109
skills/objectstack-data/rules/validation.md30243109+8530243109+85
skills/objectstack-automation/SKILL.md1261812768+1501264312768+125
Total+927+900

Growth exceeds the raise by 27 because three rows carried that much existing headroom, which is spent first. Whole shipped bundle: 186567 to 187494 tokens (+0.50 percent).

Paid down before raising: the only genuine deletion available was the two sections examples in the ui row, worth 13 tokens, and it is the fix the ruling asks for rather than a payment invented to fund the raise. Nothing else in these five files had text the new rules make redundant, so further funding would have meant deleting a live fact with no other home — the stop condition, not a budget.

The SKILL.md subtotal self-test pin shifts 118095 to 118910, exactly the 815 raised on the four SKILL.md rows (the fifth row is not a SKILL.md and correctly does not move it), so the id-strip's lowering claim keeps its original 80 tokens of slack. Same operation the 2026-08-27 pm-dispatch raise performed.

Line ratchet (node scripts/pm/check-skill-line-ratchet.mjs): decision-analysis.md stays 46 / 46 lines, no raise. The new clause is funded entirely by reflowing two paragraphs with the gate's own wrapLine, which frees exactly two lines. Widest-table-row pin unchanged at 0.

A regression this PR caused and fixed

The first commit put the authority block between the SHRINK-ONLY doc comment and export const CEILINGS, which pushed that testimony outside the 400-byte anchor window check-ratchet-remedy-authority.mjs searches around every CEILINGS mention. The farm-wide detector then classified the gate excluded instead of marked — MISCLASSIFIED, i.e. it reported that a gate had silently left the maintainer-only convention. Measured green on origin/main and red on the branch, so the regression was this PR's, not pre-existing. Second commit moves the block above the doc comment and records the constraint in place.

Worth noting for review: that gate is not in the family scripts/pm/dispatch-gates.mjs derives for these paths. It was run because a ratchet edit is exactly what it polices.

Verification

Gate union run after the final commit, at fa2a2ef70. Exit codes captured before any pipe (cmd > log 2>&1; EXIT=$?); each verdict read from the gate's own printed line.

36 gates run: the 32 the dispatch-gates family derives for this changeset (asserted with --repo objectstack-ai/objectstack), plus check:nul-bytes, check-skill-line-ratchet, the token ratchet's --self-test (64 cases), and check-ratchet-remedy-authority.

  • 34 green, including check:doc-authoring, check:corpus-claim-drift, check:skill-frame-sync, check:skill-compatibility, check:skill-identifier-liveness, check:role-word, check:pm-skill-id-lint, check:pm-skill-ratchet, check:pm-governed-merges, check:nul-bytes, both ratchets and both self-tests.
  • check:doc-formula-expressions needed @objectstack/formula and @objectstack/lint built first; after building both it is green (22 record-scoped examples, 9 spec TSDoc examples, 14 field-level predicates, all clean).
  • check-test-completeness is NOT MEASURED locally, by construction: it parses a test-run log, the derived family names it with no argument, and the gate itself prints that this branch is unreachable in CI and is not a red. CI is authoritative for it.

Changeset

None, per the three immediate precedents for skills-only PRs on this surface (PRs 14001, 13972, 13891 — none carried one). skip-changeset label applied at PR open.

Out of scope

No hotcrm files, no content/docs/releases/, no pm-dispatch SKILL.md main-file growth. The nav-item-type rows of card 13890 are a different card queued behind this one on the ui SKILL.md face and are not touched here.

Generated by Claude Code


Generated by Claude Code

…atalog
Encode the maintainer's 2026-08-31 metadata-app principles on the surface the
ruling names — the published `skills/` catalog — plus the PM decision-analysis
recommendation-order clause they imply.
- platform: a new "App / Platform Boundary" section — what an app IS, where a
capability gap gets fixed, and what a platform defect obliges (wait for the
fix; no workaround, no half-landing; verify the pin and re-run the repro
before resuming).
- ui: the section escape-hatch ladder (derive -> group reference -> hand
enumeration, last) in Record Presentation, and the docs rule that a doc
explains business concepts rather than hand-copying a machine inventory. The
file's two worked `sections` examples now reference a declared group instead
of enumerating members, so the page stops teaching the rung it demotes.
- data: the invariant-vs-transition-gate choice beside `requiredWhen`, and
blocking-rests-on-a-human-judgement beside the severity levels.
- automation: keep a screen flow at `runAs: 'user'` and move an elevated write
into a `subflow`; pin an organization predicate on a `runAs: 'system'` sweep.
- pm-dispatch decision-analysis: the app-repo exception to the recommendation
order, funded entirely by reflow within the file's 46-line ceiling.
Token ceilings rise by 900 across five rows under the ruling quoted verbatim in
the CEILINGS block; the SKILL.md subtotal pin shifts by the same amount so the
id-strip's lowering claim keeps its original slack.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Msg17tAHJ3jVTYFgHydCm2
…laration
The authority block added by the previous commit sat between the `SHRINK-ONLY`
doc comment and `export const CEILINGS`, pushing that testimony outside the
400-char anchor window check-ratchet-remedy-authority.mjs searches around every
`CEILINGS` mention. The sweep then classified this gate `excluded` instead of
`marked` — a MISCLASSIFIED failure, the farm reporting that a gate had silently
left the maintainer-only convention. Measured green on origin/main and red on
the branch, so the regression was this PR's.
Move the block above the doc comment, restoring adjacency, and record the
constraint where the next author will hit it.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Msg17tAHJ3jVTYFgHydCm2
@os-zhuang
os-zhuang marked this pull request as ready for review September 1, 2026 06:33
@os-zhuang
os-zhuang added this pull request to the merge queueSep 1, 2026
Merged via the queue into main with commit e4916fcSep 1, 2026
34 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-13848-app-principles-objectstack-half branch September 1, 2026 06:54
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/mskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants

@os-zhuang@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' docs(skills): land the app-repo working principles in the published catalog by claude[bot] · Pull Request #14052 · objectstack-ai/objectstack · GitHub
Skip to content

docs(skills): land the app-repo working principles in the published catalog - #14052

Merged
os-zhuang merged 2 commits into
mainfrom
claude/issue-13848-app-principles-objectstack-half
Sep 1, 2026
Merged

docs(skills): land the app-repo working principles in the published catalog#14052
os-zhuang merged 2 commits into
mainfrom
claude/issue-13848-app-principles-objectstack-half

Conversation

@claude

@claudeclaudeBot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

Fixes#13848

Lands the objectstack half of the 2026-08-31 app-repo principles. The hotcrm half already landed (hotcrm PR 1438); this PR discharges the card's whole remaining range — the published-skills universal items and the pm-dispatch decision-analysis clause — so the card closes with it.

⛔ Human merge required — this PR raises five shrink-only token ceilings

Governed surface, draft only. The raise is ⛔ MAINTAINER-ONLY territory and is taken here because the ruling that authorizes it names this landing surface by name. Verbatim and untranslated, recorded on the card:

「元数据应用就应该是在平台的规范下,基于skills 写元数据,并且使用平台提供的os命令校验元数据的合法性,而不是重新造轮子。这个也应该进入 hotcrm 的规范,甚至是 objectstack 的skills」

and, for the escape-hatch ladder (same day):

「或者说 skills 应该说明,逃生仓是极端场景按照客户需求自定义的场景下才需要,应该尽量避免。」

The reviewer's call is whether 900 ceiling tokens is the right price for these principles. Everything else here is mechanical.

Landing map — where each item went, and why

The card's spec rows are domain-scoped, and published skills are loaded per domain, so each rule sits where the reader is at the moment the mistake is available — not collected into one section a data-schema author never loads.

Spec rowRuleLanded inAnchor
1App is a simplified business implementation: metadata under the spec, authored from skills, checked with os; capability gaps go upstreamskills/objectstack-platform/SKILL.mdnew section "The App / Platform Boundary"
2Platform defect means wait for the fix — no workaround, no half-landing; blocked-by; verify the pin and re-run the repro before resumingsame sectionsame
4A bad platform default is a default to fixsame sectionsame
5Docs explain business concepts, not hand-copied machine inventoriesskills/objectstack-ui/SKILL.mdDocs — Package Documentation, after the authoring rules
7Invariant vs transition gate: validations[] vs requiredWhen / boundsskills/objectstack-data/SKILL.mdthe field-conditional-rule bullet list, beside requiredWhen
8Blocking rests on a human judgement; no override escape hatchskills/objectstack-data/rules/validation.mdValidation Properties — Severity Levels
9Screen flow stays runAs: 'user'; elevated writes move into a subflowskills/objectstack-automation/SKILL.mdbeside the existing readonly blockquote
10A runAs: 'system' sweep pins an organization predicate; tenant column is platform-injectedsame filesame
Principle 5The section ladder: derive, then group reference, then hand enumeration lastskills/objectstack-ui/SKILL.mdRecord Presentation, beside "let the platform lay it out"
Clause ②App-repo exception to the recommendation order.claude/skills/pm-dispatch/references/decision-analysis.mdadjacent to the 四棱分歧推荐序 段

Row 9 corrects a real drift rather than only adding: the existing readonly blockquote says a flow maintaining a readonly field must run runAs: 'system'. True of the scheduled flow it was written for; read by an agent writing a screen flow it says "elevate the whole screen flow", which elevates every other write in it.

Principle 5 also required fixing the page that taught the rung it demotes: this file's two worked sections examples enumerated their members. Both now reference a declared group, which is what the ruling asks for and is also shorter.

Budgets — before / after

Token ratchet (node scripts/check-skills-token-ratchet.mjs), unit ceil(utf8 bytes / 4):

FileTokens beforeTokens afterGrowthCeiling beforeCeiling afterRaise
skills/objectstack-platform/SKILL.md1270412984+2801270512984+279
skills/objectstack-ui/SKILL.md2514325445+3022514325445+302
skills/objectstack-data/SKILL.md1378213892+1101378313892+109
skills/objectstack-data/rules/validation.md30243109+8530243109+85
skills/objectstack-automation/SKILL.md1261812768+1501264312768+125
Total+927+900

Growth exceeds the raise by 27 because three rows carried that much existing headroom, which is spent first. Whole shipped bundle: 186567 to 187494 tokens (+0.50 percent).

Paid down before raising: the only genuine deletion available was the two sections examples in the ui row, worth 13 tokens, and it is the fix the ruling asks for rather than a payment invented to fund the raise. Nothing else in these five files had text the new rules make redundant, so further funding would have meant deleting a live fact with no other home — the stop condition, not a budget.

The SKILL.md subtotal self-test pin shifts 118095 to 118910, exactly the 815 raised on the four SKILL.md rows (the fifth row is not a SKILL.md and correctly does not move it), so the id-strip's lowering claim keeps its original 80 tokens of slack. Same operation the 2026-08-27 pm-dispatch raise performed.

Line ratchet (node scripts/pm/check-skill-line-ratchet.mjs): decision-analysis.md stays 46 / 46 lines, no raise. The new clause is funded entirely by reflowing two paragraphs with the gate's own wrapLine, which frees exactly two lines. Widest-table-row pin unchanged at 0.

A regression this PR caused and fixed

The first commit put the authority block between the SHRINK-ONLY doc comment and export const CEILINGS, which pushed that testimony outside the 400-byte anchor window check-ratchet-remedy-authority.mjs searches around every CEILINGS mention. The farm-wide detector then classified the gate excluded instead of marked — MISCLASSIFIED, i.e. it reported that a gate had silently left the maintainer-only convention. Measured green on origin/main and red on the branch, so the regression was this PR's, not pre-existing. Second commit moves the block above the doc comment and records the constraint in place.

Worth noting for review: that gate is not in the family scripts/pm/dispatch-gates.mjs derives for these paths. It was run because a ratchet edit is exactly what it polices.

Verification

Gate union run after the final commit, at fa2a2ef70. Exit codes captured before any pipe (cmd > log 2>&1; EXIT=$?); each verdict read from the gate's own printed line.

36 gates run: the 32 the dispatch-gates family derives for this changeset (asserted with --repo objectstack-ai/objectstack), plus check:nul-bytes, check-skill-line-ratchet, the token ratchet's --self-test (64 cases), and check-ratchet-remedy-authority.

  • 34 green, including check:doc-authoring, check:corpus-claim-drift, check:skill-frame-sync, check:skill-compatibility, check:skill-identifier-liveness, check:role-word, check:pm-skill-id-lint, check:pm-skill-ratchet, check:pm-governed-merges, check:nul-bytes, both ratchets and both self-tests.
  • check:doc-formula-expressions needed @objectstack/formula and @objectstack/lint built first; after building both it is green (22 record-scoped examples, 9 spec TSDoc examples, 14 field-level predicates, all clean).
  • check-test-completeness is NOT MEASURED locally, by construction: it parses a test-run log, the derived family names it with no argument, and the gate itself prints that this branch is unreachable in CI and is not a red. CI is authoritative for it.

Changeset

None, per the three immediate precedents for skills-only PRs on this surface (PRs 14001, 13972, 13891 — none carried one). skip-changeset label applied at PR open.

Out of scope

No hotcrm files, no content/docs/releases/, no pm-dispatch SKILL.md main-file growth. The nav-item-type rows of card 13890 are a different card queued behind this one on the ui SKILL.md face and are not touched here.

Generated by Claude Code


Generated by Claude Code

…atalog
Encode the maintainer's 2026-08-31 metadata-app principles on the surface the
ruling names — the published `skills/` catalog — plus the PM decision-analysis
recommendation-order clause they imply.
- platform: a new "App / Platform Boundary" section — what an app IS, where a
capability gap gets fixed, and what a platform defect obliges (wait for the
fix; no workaround, no half-landing; verify the pin and re-run the repro
before resuming).
- ui: the section escape-hatch ladder (derive -> group reference -> hand
enumeration, last) in Record Presentation, and the docs rule that a doc
explains business concepts rather than hand-copying a machine inventory. The
file's two worked `sections` examples now reference a declared group instead
of enumerating members, so the page stops teaching the rung it demotes.
- data: the invariant-vs-transition-gate choice beside `requiredWhen`, and
blocking-rests-on-a-human-judgement beside the severity levels.
- automation: keep a screen flow at `runAs: 'user'` and move an elevated write
into a `subflow`; pin an organization predicate on a `runAs: 'system'` sweep.
- pm-dispatch decision-analysis: the app-repo exception to the recommendation
order, funded entirely by reflow within the file's 46-line ceiling.
Token ceilings rise by 900 across five rows under the ruling quoted verbatim in
the CEILINGS block; the SKILL.md subtotal pin shifts by the same amount so the
id-strip's lowering claim keeps its original slack.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Msg17tAHJ3jVTYFgHydCm2
…laration
The authority block added by the previous commit sat between the `SHRINK-ONLY`
doc comment and `export const CEILINGS`, pushing that testimony outside the
400-char anchor window check-ratchet-remedy-authority.mjs searches around every
`CEILINGS` mention. The sweep then classified this gate `excluded` instead of
`marked` — a MISCLASSIFIED failure, the farm reporting that a gate had silently
left the maintainer-only convention. Measured green on origin/main and red on
the branch, so the regression was this PR's.
Move the block above the doc comment, restoring adjacency, and record the
constraint where the next author will hit it.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Msg17tAHJ3jVTYFgHydCm2
@os-zhuang
os-zhuang marked this pull request as ready for review September 1, 2026 06:33
@os-zhuang
os-zhuang added this pull request to the merge queueSep 1, 2026
Merged via the queue into main with commit e4916fcSep 1, 2026
34 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-13848-app-principles-objectstack-half branch September 1, 2026 06:54
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/mskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants

@os-zhuang@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' docs(skills): land the app-repo working principles in the published catalog by claude[bot] · Pull Request #14052 · objectstack-ai/objectstack · GitHub
Skip to content

docs(skills): land the app-repo working principles in the published catalog - #14052

Merged
os-zhuang merged 2 commits into
mainfrom
claude/issue-13848-app-principles-objectstack-half
Sep 1, 2026
Merged

docs(skills): land the app-repo working principles in the published catalog#14052
os-zhuang merged 2 commits into
mainfrom
claude/issue-13848-app-principles-objectstack-half

Conversation

@claude

@claudeclaudeBot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

Fixes#13848

Lands the objectstack half of the 2026-08-31 app-repo principles. The hotcrm half already landed (hotcrm PR 1438); this PR discharges the card's whole remaining range — the published-skills universal items and the pm-dispatch decision-analysis clause — so the card closes with it.

⛔ Human merge required — this PR raises five shrink-only token ceilings

Governed surface, draft only. The raise is ⛔ MAINTAINER-ONLY territory and is taken here because the ruling that authorizes it names this landing surface by name. Verbatim and untranslated, recorded on the card:

「元数据应用就应该是在平台的规范下,基于skills 写元数据,并且使用平台提供的os命令校验元数据的合法性,而不是重新造轮子。这个也应该进入 hotcrm 的规范,甚至是 objectstack 的skills」

and, for the escape-hatch ladder (same day):

「或者说 skills 应该说明,逃生仓是极端场景按照客户需求自定义的场景下才需要,应该尽量避免。」

The reviewer's call is whether 900 ceiling tokens is the right price for these principles. Everything else here is mechanical.

Landing map — where each item went, and why

The card's spec rows are domain-scoped, and published skills are loaded per domain, so each rule sits where the reader is at the moment the mistake is available — not collected into one section a data-schema author never loads.

Spec rowRuleLanded inAnchor
1App is a simplified business implementation: metadata under the spec, authored from skills, checked with os; capability gaps go upstreamskills/objectstack-platform/SKILL.mdnew section "The App / Platform Boundary"
2Platform defect means wait for the fix — no workaround, no half-landing; blocked-by; verify the pin and re-run the repro before resumingsame sectionsame
4A bad platform default is a default to fixsame sectionsame
5Docs explain business concepts, not hand-copied machine inventoriesskills/objectstack-ui/SKILL.mdDocs — Package Documentation, after the authoring rules
7Invariant vs transition gate: validations[] vs requiredWhen / boundsskills/objectstack-data/SKILL.mdthe field-conditional-rule bullet list, beside requiredWhen
8Blocking rests on a human judgement; no override escape hatchskills/objectstack-data/rules/validation.mdValidation Properties — Severity Levels
9Screen flow stays runAs: 'user'; elevated writes move into a subflowskills/objectstack-automation/SKILL.mdbeside the existing readonly blockquote
10A runAs: 'system' sweep pins an organization predicate; tenant column is platform-injectedsame filesame
Principle 5The section ladder: derive, then group reference, then hand enumeration lastskills/objectstack-ui/SKILL.mdRecord Presentation, beside "let the platform lay it out"
Clause ②App-repo exception to the recommendation order.claude/skills/pm-dispatch/references/decision-analysis.mdadjacent to the 四棱分歧推荐序 段

Row 9 corrects a real drift rather than only adding: the existing readonly blockquote says a flow maintaining a readonly field must run runAs: 'system'. True of the scheduled flow it was written for; read by an agent writing a screen flow it says "elevate the whole screen flow", which elevates every other write in it.

Principle 5 also required fixing the page that taught the rung it demotes: this file's two worked sections examples enumerated their members. Both now reference a declared group, which is what the ruling asks for and is also shorter.

Budgets — before / after

Token ratchet (node scripts/check-skills-token-ratchet.mjs), unit ceil(utf8 bytes / 4):

FileTokens beforeTokens afterGrowthCeiling beforeCeiling afterRaise
skills/objectstack-platform/SKILL.md1270412984+2801270512984+279
skills/objectstack-ui/SKILL.md2514325445+3022514325445+302
skills/objectstack-data/SKILL.md1378213892+1101378313892+109
skills/objectstack-data/rules/validation.md30243109+8530243109+85
skills/objectstack-automation/SKILL.md1261812768+1501264312768+125
Total+927+900

Growth exceeds the raise by 27 because three rows carried that much existing headroom, which is spent first. Whole shipped bundle: 186567 to 187494 tokens (+0.50 percent).

Paid down before raising: the only genuine deletion available was the two sections examples in the ui row, worth 13 tokens, and it is the fix the ruling asks for rather than a payment invented to fund the raise. Nothing else in these five files had text the new rules make redundant, so further funding would have meant deleting a live fact with no other home — the stop condition, not a budget.

The SKILL.md subtotal self-test pin shifts 118095 to 118910, exactly the 815 raised on the four SKILL.md rows (the fifth row is not a SKILL.md and correctly does not move it), so the id-strip's lowering claim keeps its original 80 tokens of slack. Same operation the 2026-08-27 pm-dispatch raise performed.

Line ratchet (node scripts/pm/check-skill-line-ratchet.mjs): decision-analysis.md stays 46 / 46 lines, no raise. The new clause is funded entirely by reflowing two paragraphs with the gate's own wrapLine, which frees exactly two lines. Widest-table-row pin unchanged at 0.

A regression this PR caused and fixed

The first commit put the authority block between the SHRINK-ONLY doc comment and export const CEILINGS, which pushed that testimony outside the 400-byte anchor window check-ratchet-remedy-authority.mjs searches around every CEILINGS mention. The farm-wide detector then classified the gate excluded instead of marked — MISCLASSIFIED, i.e. it reported that a gate had silently left the maintainer-only convention. Measured green on origin/main and red on the branch, so the regression was this PR's, not pre-existing. Second commit moves the block above the doc comment and records the constraint in place.

Worth noting for review: that gate is not in the family scripts/pm/dispatch-gates.mjs derives for these paths. It was run because a ratchet edit is exactly what it polices.

Verification

Gate union run after the final commit, at fa2a2ef70. Exit codes captured before any pipe (cmd > log 2>&1; EXIT=$?); each verdict read from the gate's own printed line.

36 gates run: the 32 the dispatch-gates family derives for this changeset (asserted with --repo objectstack-ai/objectstack), plus check:nul-bytes, check-skill-line-ratchet, the token ratchet's --self-test (64 cases), and check-ratchet-remedy-authority.

  • 34 green, including check:doc-authoring, check:corpus-claim-drift, check:skill-frame-sync, check:skill-compatibility, check:skill-identifier-liveness, check:role-word, check:pm-skill-id-lint, check:pm-skill-ratchet, check:pm-governed-merges, check:nul-bytes, both ratchets and both self-tests.
  • check:doc-formula-expressions needed @objectstack/formula and @objectstack/lint built first; after building both it is green (22 record-scoped examples, 9 spec TSDoc examples, 14 field-level predicates, all clean).
  • check-test-completeness is NOT MEASURED locally, by construction: it parses a test-run log, the derived family names it with no argument, and the gate itself prints that this branch is unreachable in CI and is not a red. CI is authoritative for it.

Changeset

None, per the three immediate precedents for skills-only PRs on this surface (PRs 14001, 13972, 13891 — none carried one). skip-changeset label applied at PR open.

Out of scope

No hotcrm files, no content/docs/releases/, no pm-dispatch SKILL.md main-file growth. The nav-item-type rows of card 13890 are a different card queued behind this one on the ui SKILL.md face and are not touched here.

Generated by Claude Code


Generated by Claude Code

…atalog
Encode the maintainer's 2026-08-31 metadata-app principles on the surface the
ruling names — the published `skills/` catalog — plus the PM decision-analysis
recommendation-order clause they imply.
- platform: a new "App / Platform Boundary" section — what an app IS, where a
capability gap gets fixed, and what a platform defect obliges (wait for the
fix; no workaround, no half-landing; verify the pin and re-run the repro
before resuming).
- ui: the section escape-hatch ladder (derive -> group reference -> hand
enumeration, last) in Record Presentation, and the docs rule that a doc
explains business concepts rather than hand-copying a machine inventory. The
file's two worked `sections` examples now reference a declared group instead
of enumerating members, so the page stops teaching the rung it demotes.
- data: the invariant-vs-transition-gate choice beside `requiredWhen`, and
blocking-rests-on-a-human-judgement beside the severity levels.
- automation: keep a screen flow at `runAs: 'user'` and move an elevated write
into a `subflow`; pin an organization predicate on a `runAs: 'system'` sweep.
- pm-dispatch decision-analysis: the app-repo exception to the recommendation
order, funded entirely by reflow within the file's 46-line ceiling.
Token ceilings rise by 900 across five rows under the ruling quoted verbatim in
the CEILINGS block; the SKILL.md subtotal pin shifts by the same amount so the
id-strip's lowering claim keeps its original slack.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Msg17tAHJ3jVTYFgHydCm2
…laration
The authority block added by the previous commit sat between the `SHRINK-ONLY`
doc comment and `export const CEILINGS`, pushing that testimony outside the
400-char anchor window check-ratchet-remedy-authority.mjs searches around every
`CEILINGS` mention. The sweep then classified this gate `excluded` instead of
`marked` — a MISCLASSIFIED failure, the farm reporting that a gate had silently
left the maintainer-only convention. Measured green on origin/main and red on
the branch, so the regression was this PR's.
Move the block above the doc comment, restoring adjacency, and record the
constraint where the next author will hit it.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Msg17tAHJ3jVTYFgHydCm2
@os-zhuang
os-zhuang marked this pull request as ready for review September 1, 2026 06:33
@os-zhuang
os-zhuang added this pull request to the merge queueSep 1, 2026
Merged via the queue into main with commit e4916fcSep 1, 2026
34 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-13848-app-principles-objectstack-half branch September 1, 2026 06:54
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/mskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants

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

docs(skills): land the app-repo working principles in the published catalog - #14052

Merged
os-zhuang merged 2 commits into
mainfrom
claude/issue-13848-app-principles-objectstack-half
Sep 1, 2026
Merged

docs(skills): land the app-repo working principles in the published catalog#14052
os-zhuang merged 2 commits into
mainfrom
claude/issue-13848-app-principles-objectstack-half

Conversation

@claude

@claudeclaudeBot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

Fixes#13848

Lands the objectstack half of the 2026-08-31 app-repo principles. The hotcrm half already landed (hotcrm PR 1438); this PR discharges the card's whole remaining range — the published-skills universal items and the pm-dispatch decision-analysis clause — so the card closes with it.

⛔ Human merge required — this PR raises five shrink-only token ceilings

Governed surface, draft only. The raise is ⛔ MAINTAINER-ONLY territory and is taken here because the ruling that authorizes it names this landing surface by name. Verbatim and untranslated, recorded on the card:

「元数据应用就应该是在平台的规范下,基于skills 写元数据,并且使用平台提供的os命令校验元数据的合法性,而不是重新造轮子。这个也应该进入 hotcrm 的规范,甚至是 objectstack 的skills」

and, for the escape-hatch ladder (same day):

「或者说 skills 应该说明,逃生仓是极端场景按照客户需求自定义的场景下才需要,应该尽量避免。」

The reviewer's call is whether 900 ceiling tokens is the right price for these principles. Everything else here is mechanical.

Landing map — where each item went, and why

The card's spec rows are domain-scoped, and published skills are loaded per domain, so each rule sits where the reader is at the moment the mistake is available — not collected into one section a data-schema author never loads.

Spec rowRuleLanded inAnchor
1App is a simplified business implementation: metadata under the spec, authored from skills, checked with os; capability gaps go upstreamskills/objectstack-platform/SKILL.mdnew section "The App / Platform Boundary"
2Platform defect means wait for the fix — no workaround, no half-landing; blocked-by; verify the pin and re-run the repro before resumingsame sectionsame
4A bad platform default is a default to fixsame sectionsame
5Docs explain business concepts, not hand-copied machine inventoriesskills/objectstack-ui/SKILL.mdDocs — Package Documentation, after the authoring rules
7Invariant vs transition gate: validations[] vs requiredWhen / boundsskills/objectstack-data/SKILL.mdthe field-conditional-rule bullet list, beside requiredWhen
8Blocking rests on a human judgement; no override escape hatchskills/objectstack-data/rules/validation.mdValidation Properties — Severity Levels
9Screen flow stays runAs: 'user'; elevated writes move into a subflowskills/objectstack-automation/SKILL.mdbeside the existing readonly blockquote
10A runAs: 'system' sweep pins an organization predicate; tenant column is platform-injectedsame filesame
Principle 5The section ladder: derive, then group reference, then hand enumeration lastskills/objectstack-ui/SKILL.mdRecord Presentation, beside "let the platform lay it out"
Clause ②App-repo exception to the recommendation order.claude/skills/pm-dispatch/references/decision-analysis.mdadjacent to the 四棱分歧推荐序 段

Row 9 corrects a real drift rather than only adding: the existing readonly blockquote says a flow maintaining a readonly field must run runAs: 'system'. True of the scheduled flow it was written for; read by an agent writing a screen flow it says "elevate the whole screen flow", which elevates every other write in it.

Principle 5 also required fixing the page that taught the rung it demotes: this file's two worked sections examples enumerated their members. Both now reference a declared group, which is what the ruling asks for and is also shorter.

Budgets — before / after

Token ratchet (node scripts/check-skills-token-ratchet.mjs), unit ceil(utf8 bytes / 4):

FileTokens beforeTokens afterGrowthCeiling beforeCeiling afterRaise
skills/objectstack-platform/SKILL.md1270412984+2801270512984+279
skills/objectstack-ui/SKILL.md2514325445+3022514325445+302
skills/objectstack-data/SKILL.md1378213892+1101378313892+109
skills/objectstack-data/rules/validation.md30243109+8530243109+85
skills/objectstack-automation/SKILL.md1261812768+1501264312768+125
Total+927+900

Growth exceeds the raise by 27 because three rows carried that much existing headroom, which is spent first. Whole shipped bundle: 186567 to 187494 tokens (+0.50 percent).

Paid down before raising: the only genuine deletion available was the two sections examples in the ui row, worth 13 tokens, and it is the fix the ruling asks for rather than a payment invented to fund the raise. Nothing else in these five files had text the new rules make redundant, so further funding would have meant deleting a live fact with no other home — the stop condition, not a budget.

The SKILL.md subtotal self-test pin shifts 118095 to 118910, exactly the 815 raised on the four SKILL.md rows (the fifth row is not a SKILL.md and correctly does not move it), so the id-strip's lowering claim keeps its original 80 tokens of slack. Same operation the 2026-08-27 pm-dispatch raise performed.

Line ratchet (node scripts/pm/check-skill-line-ratchet.mjs): decision-analysis.md stays 46 / 46 lines, no raise. The new clause is funded entirely by reflowing two paragraphs with the gate's own wrapLine, which frees exactly two lines. Widest-table-row pin unchanged at 0.

A regression this PR caused and fixed

The first commit put the authority block between the SHRINK-ONLY doc comment and export const CEILINGS, which pushed that testimony outside the 400-byte anchor window check-ratchet-remedy-authority.mjs searches around every CEILINGS mention. The farm-wide detector then classified the gate excluded instead of marked — MISCLASSIFIED, i.e. it reported that a gate had silently left the maintainer-only convention. Measured green on origin/main and red on the branch, so the regression was this PR's, not pre-existing. Second commit moves the block above the doc comment and records the constraint in place.

Worth noting for review: that gate is not in the family scripts/pm/dispatch-gates.mjs derives for these paths. It was run because a ratchet edit is exactly what it polices.

Verification

Gate union run after the final commit, at fa2a2ef70. Exit codes captured before any pipe (cmd > log 2>&1; EXIT=$?); each verdict read from the gate's own printed line.

36 gates run: the 32 the dispatch-gates family derives for this changeset (asserted with --repo objectstack-ai/objectstack), plus check:nul-bytes, check-skill-line-ratchet, the token ratchet's --self-test (64 cases), and check-ratchet-remedy-authority.

  • 34 green, including check:doc-authoring, check:corpus-claim-drift, check:skill-frame-sync, check:skill-compatibility, check:skill-identifier-liveness, check:role-word, check:pm-skill-id-lint, check:pm-skill-ratchet, check:pm-governed-merges, check:nul-bytes, both ratchets and both self-tests.
  • check:doc-formula-expressions needed @objectstack/formula and @objectstack/lint built first; after building both it is green (22 record-scoped examples, 9 spec TSDoc examples, 14 field-level predicates, all clean).
  • check-test-completeness is NOT MEASURED locally, by construction: it parses a test-run log, the derived family names it with no argument, and the gate itself prints that this branch is unreachable in CI and is not a red. CI is authoritative for it.

Changeset

None, per the three immediate precedents for skills-only PRs on this surface (PRs 14001, 13972, 13891 — none carried one). skip-changeset label applied at PR open.

Out of scope

No hotcrm files, no content/docs/releases/, no pm-dispatch SKILL.md main-file growth. The nav-item-type rows of card 13890 are a different card queued behind this one on the ui SKILL.md face and are not touched here.

Generated by Claude Code


Generated by Claude Code

…atalog
Encode the maintainer's 2026-08-31 metadata-app principles on the surface the
ruling names — the published `skills/` catalog — plus the PM decision-analysis
recommendation-order clause they imply.
- platform: a new "App / Platform Boundary" section — what an app IS, where a
capability gap gets fixed, and what a platform defect obliges (wait for the
fix; no workaround, no half-landing; verify the pin and re-run the repro
before resuming).
- ui: the section escape-hatch ladder (derive -> group reference -> hand
enumeration, last) in Record Presentation, and the docs rule that a doc
explains business concepts rather than hand-copying a machine inventory. The
file's two worked `sections` examples now reference a declared group instead
of enumerating members, so the page stops teaching the rung it demotes.
- data: the invariant-vs-transition-gate choice beside `requiredWhen`, and
blocking-rests-on-a-human-judgement beside the severity levels.
- automation: keep a screen flow at `runAs: 'user'` and move an elevated write
into a `subflow`; pin an organization predicate on a `runAs: 'system'` sweep.
- pm-dispatch decision-analysis: the app-repo exception to the recommendation
order, funded entirely by reflow within the file's 46-line ceiling.
Token ceilings rise by 900 across five rows under the ruling quoted verbatim in
the CEILINGS block; the SKILL.md subtotal pin shifts by the same amount so the
id-strip's lowering claim keeps its original slack.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Msg17tAHJ3jVTYFgHydCm2
…laration
The authority block added by the previous commit sat between the `SHRINK-ONLY`
doc comment and `export const CEILINGS`, pushing that testimony outside the
400-char anchor window check-ratchet-remedy-authority.mjs searches around every
`CEILINGS` mention. The sweep then classified this gate `excluded` instead of
`marked` — a MISCLASSIFIED failure, the farm reporting that a gate had silently
left the maintainer-only convention. Measured green on origin/main and red on
the branch, so the regression was this PR's.
Move the block above the doc comment, restoring adjacency, and record the
constraint where the next author will hit it.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Msg17tAHJ3jVTYFgHydCm2
@os-zhuang
os-zhuang marked this pull request as ready for review September 1, 2026 06:33
@os-zhuang
os-zhuang added this pull request to the merge queueSep 1, 2026
Merged via the queue into main with commit e4916fcSep 1, 2026
34 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-13848-app-principles-objectstack-half branch September 1, 2026 06:54
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/mskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants

@os-zhuang@claude