Skip to content

feat(skills): Skills & Health — skill runtime, instruction resolver, doctor v2, support bundle - #71

Open
AetherAI3 wants to merge 16 commits into
mainfrom
feat/skills-health
Open

feat(skills): Skills & Health — skill runtime, instruction resolver, doctor v2, support bundle#71
AetherAI3 wants to merge 16 commits into
mainfrom
feat/skills-health

Conversation

@AetherAI3

Copy link
Copy Markdown
Owner

This lane had been sitting unpushed on a local worktree with no branch on origin and no CI ever run against it. Opening it so it gets reviewed and exercised.

Sixteen commits, 100 files, roughly +9157/-343. What is in it:

  • Skills core — the aether.skill/v1 schema, digest, lock, trust, discovery, resolution, lazy loading, and policy.
  • Skills surface — the aether skills CLI family, the /skills REPL command, six built-in skills, and an offline eval engine with skills eval.
  • Instructions and policyInstructionResolver with provenance and conflict reporting; network becomes an explicit gate category. Includes a fix where test-command extraction swallowed the rest of a sentence.
  • Dev session — skill and instruction context on the wire, with an honest refusal on legacy peers.
  • Capability matrix — packaged fallback snapshot plus resolver, pinned to the merged cloud SHA, and an aether capabilities command with /why explanations.
  • Doctor v2 — modular diagnostics, backup-first safe repair, and a redacted self-verifying support bundle.
  • Hardening — Loop F: bounded indexing, no retained bodies, trust-gated automatic selection at scale.
  • Docs — skill authoring, instruction compatibility, capability contract guides, the release record skeleton, and a current-state baseline.

Notes for review: the branch is six commits behind main and will need a rebase, and CI has never run on this code, so expect the first run to be informative rather than green.

🤖 Generated with Claude Code

AetherAI3 and others added 16 commits August 14, 2026 13:58
…urce-of-truth map

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…very, resolution, lazy loading, policy

Strict-JSON manifest validation (closed keys, reserved aether/* namespace,
tool/permission vocabulary checks, safe relative paths), canonical
length-prefixed SHA-256 package digest, committed-safe lock file, local
digest-bound trust store, metadata-only discovery, explicit/automatic
resolution with ambiguity + dependency-cycle refusals, TOCTOU-checked lazy
body loading, intersection-only policy enforcement, and the bounded typed
skill context packet. Stable skill.* refusal codes throughout.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…and conflicts; network becomes an explicit gate category

InstructionResolver: bounded read-only discovery of .aether/instructions.md,
root and nested AGENTS.md, user-level instructions, and CLAUDE.md / GEMINI.md /
copilot / Cursor-rule compatibility imports; nested scoping, explicit
precedence (nearest nested > canonical project > root > user > imports),
test-command conflict detection with the effective winner and reason, honest
unsupported-syntax warnings (a Cursor rule we cannot parse is NOT applied
globally), truncation and binary-file skips with visible reasons, and a typed
instruction context packet carrying per-source digests.

Gate repair: web_search/web_fetch now map to a 'network' gate action instead
of falling through ungated; doctor's tools.gates check and autonomy tests
pin the new mapping. Gate prompts show url/query detail.

Includes skill-core unit tests (schema, digest, trust/lock, discovery,
resolution, lazy-loading proof with TOCTOU refusal, policy, context packet).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…legacy refusal

Additive DevSessionWireRequest fields (capability_contract_version,
skill_context, instruction_context — absent for legacy runs), CloudBrain
DevSessionContext, skill_context_ack / instruction_context_ack frame decoding
and visible acknowledgement rendering, and the skill-session assembly used by
'aether agent': discover, resolve explicit (--skill) plus bounded automatic
candidates, lazy-load, packet build, visible Skills/Rules/Conflict header, and
per-call policy enforcement in the tool gate ahead of the permission gate.
A legacy server with skill context present refuses with
skill.server_unsupported unless --no-skills deliberately opts out.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…x built-in skills, offline eval engine

aether skills list/show/explain/create/install/enable/disable/trust/untrust/
lock/check with stable exit codes; trust requires --yes or interactive
confirm and fails closed without a TTY; show/explain never print skill
bodies. /skills mirrors the read-only family through one registry entry and
routes trust to the deliberate CLI action. Built-ins (aether/review-pr,
fix-ci, ship, doctor-project, research-and-implement,
frontend-from-screenshot) ship as strict manifests + SKILL.md copied into
dist/src/skills/builtin by the new deterministic post-build asset step.
skill_eval.ts runs the schema/resolution/policy eval layers offline —
zero model calls, zero UVT — with JUnit output for CI.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…skills eval subcommand

Every built-in declares evals/cases.json exercising resolution (automatic
trigger selection) and policy (allowed tools pass, denied tools refuse with
codes) with max_uvt 0 pinned — offline evals are zero-spend by construction.
'aether skills eval [id|--all] [--json] [--junit <path>]' runs them; the
asset copy step now ships evals/ and templates/ alongside references/.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…solver

src/generated/agent_capabilities.ts pins the canonical AETHER-CLOUD contract
(source repo, commit, version, canonical sha256 — digest verified equal to the
Python contract_digest byte-for-byte). resolveCapabilities() prefers the
server manifest, falls back to the snapshot with a visible warning, refuses an
incompatible major contract version, and never mixes vocabularies. Renderer
separates static support from runtime availability.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…t of a sentence

The single greedy regex let 'pytest tests/api. Never cargo test --all here.'
consume everything after pytest, hiding the cargo command and polluting the
extracted value with prose. Runner commands are now token-scanned: args must
look like flags, paths, or scoped targets, and sentence punctuation ends the
command. All 11 instruction tests pass.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…lity contract guides

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…-gated automatic selection at scale

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…s, and rollback path

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Pro/Team now lists Claude Opus 5, the GPT-5.6 family, Kimi K3, and Gemini 3.6
Flash first, with the previous generation (Opus 4.8, GPT-5.5, DeepSeek V4 Pro,
Kimi K2.6, Gemma 4 31B) labeled as still selectable rather than presented as
the flagship set. Frontier table unchanged — already current.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…oud SHA

Snapshot now cites AetherAI3/AETHER-CLOUD@97eacd3e (PR #1065, merged and
deployed dark). Contract content and canonical digest unchanged
(8da09423…). Release record updated with the merge evidence.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ostics, backup-first repair, redacted self-verifying bundle

Doctor v2: diagnostics split into cohesive category modules with a check
registry and executor (old ids/behaviors preserved verbatim; diagnostics.ts
is now a re-export shim). New skills/instructions checks, --network (--deep
alias), --category, --failed, --junit, --schema v1|v2 (v1 default for
existing JSON consumers), and --live driving one synthetic dev session end
to end (auth, negotiation, pause/resume acks, sandboxed write-read round
trip, sequence check, teardown, no-residue) with zero model spend.

Safe repair: --fix dry-runs a plan; --fix --yes applies with backup-first
atomic transactions, verify, rollback on failure, and metadata-only receipts
in repair-receipts.jsonl. Only skill-index rebuild, config-dir creation, and
stale-tmp pruning are implemented; destructive classes are documented as
forbidden.

Support bundle: aether support-bundle stages 8 allowlisted metadata-only
entries in a 0700 temp dir, packages with a minimal deterministic ustar
writer, reopens and re-parses the candidate, enforces the entry allowlist,
runs the canonical secret scanner (redaction.ts consolidates session_log's
helpers plus JWT/bearer/hex/userinfo/homedir detectors), verifies per-file
hashes, and only then renames into place — any failure deletes the candidate.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… /why explanations, skills eval flags

aether capabilities [--json] [--available] renders static support separately
from runtime availability (packaged snapshot offline, server manifest when
signed in). /why replays the bounded explanation log — skill selections with
reasons and confidence, refusals, permission denials, and instruction
conflicts record entries at the moment they happen. aether agent gains
--skill <id> and --no-skills; skills eval gains --json/--junit passthrough.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant