`argument-hint: [foo]` YAML-parses as a flow sequence (array), not a
string. Downstream slash-command loaders that validate `argument-hint`
as a string — notably GitHub Copilot CLI ≥ 1.0.65 — silently reject
the skill on load, and the command disappears from the CLI menu.
Wrap the value in double quotes so it parses as a string. No behaviour
change on Claude Code.
Five findings from cross-model review:
1. specHash now has an EXACT canonical form (parse YAML → json.dumps
sort_keys/no-whitespace → sha256[:8]) with the exact command in-file;
verified reproducible across key order / comments / whitespace variants.
2. smoke.gpu_tests is structured {cmd, expect} so the witness regex the
validation tier requires actually exists in the spec schema (was list[str]).
3. vast-gpu Setup Step 1 no longer contradicts the contract: renders ordered
phases (pins first), requirements.txt demoted to legacy single-phase
fallback with conversion guidance.
4. serverless-modal example shows chained per-phase .pip_install() calls as
the rendered form of ordered pip_phases (was one flat call).
5. Ledger text no longer claims git-blameability: .aris/ is gitignored, so the
ledger is project-local/uncommitted by default; committed history = put the
blocks in the tracked server-notes file (block format is the contract, not
the path).
All fixes applied to mainline AND mirror copies. Parity guard 18/18.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
ARIS's 6+ compute skills (run-experiment, experiment-queue, serverless-modal,
vast-gpu, qzcli, SSH paths) each re-encoded environment knowledge with no
shared contract, so "env is ready" was vibes — the classic overnight failure
being import-success followed by a CUDA-kernel death 8 GPU-hours later.
New shared-references/compute-env-contract.md (mainline + codex mirror):
- provider SHAPES (direct SSH / scheduler cluster / managed API): recognize
which one a provider already is; the shape defines build/register/resolve.
- one DECLARATIVE SPEC per env (base, system_pkgs, ORDERED pip_phases — each
phase its own pip call, so pinning a fought-over package in an earlier phase
mechanically wins version fights — env vars, weight_dirs, smoke probes),
rendered per shape rather than re-written per skill.
- ENV LEDGER `.aris/compute/<provider>.md` with `env:<name>@<specHash>` blocks:
spec change = hash change = mechanical cache miss; unchanged = warm-reuse.
"Did the env change since last week?" becomes a string comparison.
- THREE-TIER VALIDATION: import (cheap, catches little) → seeded
kernel-dispatch witness with sentinel regex (catches wrong-SM wheels,
loader-path .so misses, RO caches; run on every build) → agent-follows-doc
(a FRESH subagent runs the documented invocation VERBATIM and reports
doc-vs-reality divergence; the author never self-certifies its own doc, per
acceptance-gate.md — run after any rebuild/doc edit, before declaring ready).
- grep-able diagnosis table (symptom → layer → fix) with the instruction to
append provider-true gotchas to the ledger.
Wired into all five compute skills (mainline + mirror) at their natural
points: run-experiment Step 1 (ledger-first), experiment-queue Core Concepts
(import-death wave = skipped contract, not a queue bug), serverless-modal
(modal.Image = the rendered form of the same spec), vast-gpu Setup (ordered
phases + witness before real run), qzcli (scheduler shape; witness inside a
submitted job, not on the login side).
The mirror carries the contract file itself (five path-referencing consumers
justify carrying per the appendage doctrine; parity guard green).
Adapted from Anthropic's Claude Science compute-env-setup skill (Apache-2.0,
re-hosted by HughYau/AcademicForge), ported off its proprietary host.* runtime
onto plain bash + SSH + subagents; credited in-file.
Verification: inventory consistent; full suite 407 passed / 16 skipped;
mirror parity guard 18/18.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Work-block 2/6 of the ultracode×ARIS integration. Least-privilege sweep of
the `Agent` tool capability across all mainline skills.
Finding (verified by exhaustive grep + codex GPT-5.5 xhigh cross-model audit):
all 48 mainline skills that listed `Agent` in `allowed-tools` were carrying a
pure boilerplate grant — NONE actually invoke the Agent tool (Tier-2 Claude
subagent spawning) anywhere in their body. The only "agent"/"spawn" phrasings
in those bodies are (a) "reviewer sub-agent" = the external codex/GPT reviewer,
and (b) proof-checker's "spawn a micro-claim / fresh thread" = proof-obligation
ledger + codex review threads. Neither needs the Agent grant.
Changes:
- Strip the bare `Agent` token from all 48 mainline `allowed-tools:` lines
(surgical: token-list parse + rejoin, no malformed/double commas; codex
confirmed each line equals old-minus-Agent with no other token dropped).
- Document the policy in shared-references/fan-out-pattern.md ("Allowed-tools
hygiene"): `Agent` is granted ONLY to skills that genuinely fan out at
Tier-2; Tier-1 (Workflow) is harness-level and needs no grant; Tier-3
(sequential, e.g. kill-argument's codex threads) spawns nothing. A skill
that adds real fan-out re-grants `Agent` in the SAME change that adds the
fan-out prose, and that prose must cite fan-out-pattern.md.
- Enforce it in tools/check_skills_inventory.py: any mainline skill granting
`Agent` whose body does not cite `fan-out-pattern.md` fails the drift check.
Prevents vestigial grants from creeping back and makes every real grant
traceable to the convention.
Codex review (fresh thread + follow-up) caught and I fixed before landing:
- frontmatter_split() originally split on "\n---" and mis-handled bodies with
`---` horizontal rules (latent now — would have bitten WB3 when proof-checker
re-grants); rewritten to anchor on the leading YAML block.
- citation match tightened from bare `fan-out-pattern` to `fan-out-pattern.md`.
- stale fan-out-pattern.md idea-creator example (said it "already declares
Agent") corrected to reflect the post-strip state + WB3 re-grant.
WB3 re-grants Agent to idea-creator / research-lit / proof-checker when it
wires their fan-out. Drift checker passes; git diff --check clean.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Add a new `vast-gpu` skill and integrate Vast.ai as a third GPU mode
alongside local and remote SSH. The skill analyzes training tasks
(model size, dataset, estimated time) to recommend cost-optimized GPU
options with estimated total cost, then handles the full lifecycle:
rent → setup → run → collect results → auto-destroy.
Closes#89
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>