Repository navigation
ci(scaffold-e2e): build the skills-boundary expected set from the whole curated skills/ catalog - #26285
Merged
Conversation
…le curated skills/ catalog The step globbed skills/objectstack-*/ only, so the objectui skill that joined skills/ made every create-objectstack PR red. Expected is now every skills/<dir>/ holding a SKILL.md — the tree @objectstack/skills ships whole — and the step refuses an empty catalog. Both leak assertions are unchanged. Claude-Session: https://claude.ai/code/session_014kunMthReAU7eVraV1qLsb Co-authored-by: Claude <noreply@anthropic.com>
…a skills/ entry has no SKILL.md Claude-Session: https://claude.ai/code/session_014kunMthReAU7eVraV1qLsb Co-authored-by: Claude <noreply@anthropic.com>
…trips, as measured Claude-Session: https://claude.ai/code/session_014kunMthReAU7eVraV1qLsb Co-authored-by: Claude <noreply@anthropic.com>
Contributor
Author
席位核对 · ACCEPT · devx seat 2 · 2026-10-26T18:54ZSeat
Generated by Claude Code |
This was referenced Oct 26, 2026
os-zhuang
approved these changes
Oct 26, 2026
os-zhuang
marked this pull request as ready for review
October 26, 2026 22:45
os-zhuang
enabled auto-merge
October 26, 2026 22:45
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Requested by Steve · project thread
Fixes #26204
Clause-②: no
Metadata-protocol: none
⛔ Tier H (
.github/workflows/**): this PR stays a draft until aGOVERNED_APPROVERSapproval. No seat readies it, queues it or arms auto-merge before that.维护者速读(草稿)
Scaffold E2E里「Skills boundary」这一步的期望技能集合,从「只认skills/objectstack-*」改成「skills/下凡是带SKILL.md的目录都算」。另外加了一道保护:若skills/读出来是空集,这一步直接失败。两条防泄漏断言(安装集合相等、仓根发现数相等)一字未动。skills/之后,这一步把它当成「泄漏」,所有动到packages/create-objectstack/**的 PR 都挂红。@objectstack/skills发布包本来就是把整个skills/原样打包,所以skills/本身就是策展目录;在工作流里再维护一份白名单,等于以后每加一个技能都要改一次受管文件。skills/新放一个普通技能目录会被当成策展技能放行(它本来也会随 npm 包发布);内部技能(metadata.internal)放进skills/、或放在skills/之外却没标 internal 的技能,仍然会让这一步失败(本地已实测,见下)。回滚就是 revert 这一个提交。What changed
.github/workflows/scaffold-e2e.yml, step "Skills boundary: only the curated skills/ catalog installs":expectedwasls -d objectstack-*/insideskills/. It is now everyskills/subdirectory that holds aSKILL.md, read with the same loop shape as the later "Skills: the scaffolder installed exactly the @objectstack/skills catalog" step.expectednow fails the step loudly instead of comparing two empty sets.expected_count, and therefore theFound N skillcheck, follows the new set. Both assertions (installed set equality, repo-root discovery count, and thedogfood-verificationgrep) are unchanged.Why a directory read and not an allow-list. The card allowed either.
@objectstack/skillsships the wholeskills/tree (packages/skills/scripts/sync-catalog.mjscopiesskills/**and--checkrefuses any difference), soskills/is the curated catalog by definition. An allow-list in this file would be a second registry of the same fact, and every new curated skill would red this step until a Tier H edit of the workflow. That is the same failure this card fixes. With the directory read, what the boundary still catches is anything that is not curated: a skill outsideskills/without the internal marker, an internal-marked skill placed inskills/, and a nested skill inside a curated directory. All three are rehearsed below.Rehearsal
The step's
run:block was extracted verbatim from the workflow (the YAML parsed with theyamlpackage) and run withbash -e, the runner's default shell for a step with noshell:.GITHUB_WORKSPACEwas the checkout, or agit archive HEADcopy for the controls.RUNNER_TEMPwas a fresh temp dir. skills CLI 1.7.4 vianpx -y skills.create-objectstackwas built from this tree. The final head's run block is byte-identical to the rehearsed one (cmp).origin/maine05e0de)objectstack-*+objectui, expected = tenobjectstack-*,::error::scaffolded skill set != curated skills/ catalog. The card's failure, reproduced.Found 11 skillstwice.claude/skills/leak-probe/Found 12 skills,::error::repo-root discovery does not match the curated catalog (expected 11 skills)metadata.internal: trueskill atskills/internal-probe/internal-probe, installed does not,::error::scaffolded skill set != curated skills/ catalogskills/objectui/guides/nested-probe/SKILL.mdnested-probe,::error::scaffolded skill set != curated skills/ catalogskills/new-curated-probe/Found 12 skills. A new curated skill passes without a workflow edit, by design.Negative B shows the skills CLI hides
metadata.internalskills even under--alltoday, so an internal skill inskills/trips assertion 1. If an older CLI did install it, assertion 2's count would trip instead. The step's comment says both.Gates
At head a9585ae, all 38 commands from
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack(change set: this one file, 14 changed lines) were run one by one with stdin from/dev/null, and each exit was captured before any pipe. Every one exited 0, includingpnpm check:pm-dispatch-gates(fast tier, 1899 cases). The--ranreconciliation reads38 derived, 38 run, 0 NOT-MEASURED, 0 UNRUN, a derived zero because every line recorded its exit code. The families the derivation prints as NOT MEASURED (workflow-valued argv, theTest Coreshard steps, the type-check lanes) are CI's. Their verdicts are this PR's check-runs.Changeset: none. The diff is one CI workflow and publishes nothing, so
skip-changesetrides the create.Acceptance notes
skills/is curated by definition (control D passes) because it also ships in@objectstack/skills. The non-curated shapes are A, B and C, and each fails.pull_request.pathslists.github/workflows/scaffold-e2e.ymlitself, so this PR runsScaffold E2E. The card's first acceptance line is read from this PR'sScaffold with repo distcheck-run, which is a real CI run of the edited step against unchanged skills.Generated by Claude Code