* test(skill-evals): land-and-deploy eval task suite (GSTA-161)
Ten tasks written before any cut: happy path, a red required check with an
--admin push (wrong-behavior control), a conflicting PR, an already-merged
PR, a dirty checkout, the first-run dry run, deploy success, deploy failure
(no revert), a canary URL with no browser, and a Render deploy hook that
needs a dashboard step. seed.sh builds a tiny Bun library with a local bare
remote; gh-stub.sh fakes PR #1, its checks, a real squash merge and the
deploy run; check.sh asserts the end state from the remote and the gh log.
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
* feat(land-and-deploy): skill diet — canary and browser contracts load on demand (GSTA-161)
Step 7's canary script and health assessment, the Aside browser contract,
the gstack-browser fallback and the Third-Party Web Actions contract move
from the always-loaded SKILL.md into sections/canary.md, read at Step 7 when
a URL is checked or before any browser step or third-party site action. The
routing rules (SKIPPED without a browser, staging and production routes) stay
in the skeleton. Shared resolvers are untouched.
Skill-Diet: land-and-deploy
Skill-Size: 107318→87590 bytes (loaded per session, confirmed run without a canary URL; SKILL.md 51992→32264)
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
* test: re-pin land-and-deploy size and carve guards after the diet (GSTA-161)
The canary section drops its duplicated health checklist and long labels so
the parity union stays under its 1.126 cap with the new pointer and index
row. Carve guard: canary.md joins expectedSections and maxSkeletonBytes
drops 52,682 -> 32,216. The codex and factory size pins go away: both hosts
are now under 100,000 chars. The browser tripwire reads land-and-deploy's
Aside contract from sections/canary.md, as it already does for qa.
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
* test(skill-evals): widen land-and-deploy canary-no-browser must before the paid verdict (GSTA-161)
The priced pilot (after arm) behaved correctly: it reported MERGED
(UNVERIFIED) and 'URL check skipped' with no browser, but the pattern only
accepted canary/health/browser before 'skipped'. Detector fix, the same for
every arm, made before any before/after cell ran.
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
* test(skill-evals): drop private:true from the land-and-deploy deploy fixtures (GSTA-161)
The Deploy workflow runs bun publish, which refuses a private package, so
deploy-ok's 'deploy works' scenario was not actually deployable and a careful
run correctly held the merge. Variant-scoped: other tasks seed identical repos.
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
* changelog.d: land-and-deploy diet fragment (GSTA-161)
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
* changelog.d: scope the land-and-deploy saving to Claude Code (GSTA-161)
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
---------
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
* fix(skill-evals): close four Lane A check-command holes (GST-377)
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
* test: register skill-eval-checks in the test-of-test baseline; docs: describe the tightened checks (GST-377)
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
---------
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
* test(skill-evals): /learn before/after tasks, written before any cut (GSTA-133)
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
* fix(learnings): --help, unknown-flag errors and --stats on the learnings bins; cross-project search no longer drops every project when the state root path contains the slug
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
* refactor(learn): diet /learn onto the levels: tool flags replace the inline stats program, one mode table, prune rules kept
Skill-Diet: learn
Skill-Size: 5797→2586 bytes (SKILL.md.tmpl)
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
* feat(write-skill): /write-skill skill, gstack-skill-bill, static skill-to-bin drift ratchet, shared skill eval contract
Skill-Size: 0→3245 bytes (write-skill/SKILL.md.tmpl)
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
* fix(learn): guard the state-root lookup in Prune; re-measure the learn ceiling
Skill-Size: 2586→2707 bytes (learn/SKILL.md.tmpl)
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
* fix: pre-landing review fixes (drift scanner, learnings flags, skill-bill baselines, eval fixtures)
- skill-bin-drift: a redirect no longer ends a command, so `bin/x 2>/dev/null --bogus` is checked
- gstack-learnings-search: a missing value or a non-positive --limit exits 2 like an unknown flag
- gstack-skill-bill: the gstack root skill is a checkout skill; Skill-Diet trailers match the exact name; the baseline counts the committed bytes untrimmed
- skill-evals task files get a free contract test and are registered in FREE_FIXTURES, with the drift allowlist
- learn eval: the no-code-change safety task no longer asks the model to fix code (its check penalised obeying the user)
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
* fix(learn,write-skill): full bin paths in the mode table; prune asks per entry unless the request names the action
Skill-Diet: learn
Skill-Size: 2707→2955 bytes (learn/SKILL.md.tmpl)
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
* docs(changelog): /write-skill, gstack-skill-bill, drift ratchet, eval contract, /learn diet
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
* docs: drift ratchet in CONTRIBUTING's static tests; /learn prune example asks per entry
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
* fix(skill-bill): report a checkout skill's eval task file and check it against the contract
The skill-evals task-file test now exercises lib/skill-bill.ts's checkEvalTasks, with a negative control, instead of a test-only validator (test-of-test ratchet).
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
* fix(skill-bill): EVAL TASKS path uses forward slashes on every platform; a non-object task entry is a problem, not a crash
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
* fix(learn): BASH_COMPAT guard on in-window heredocs; count skill-e2e-write-skill in the paid census
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
---------
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>