amico catalog (#111): B2 — real repertoire query + verified ingest verb - #119
Closed
aarontrowbridge wants to merge 1 commit into
Closed
amico catalog (#111): B2 — real repertoire query + verified ingest verb#119aarontrowbridge wants to merge 1 commit into
aarontrowbridge wants to merge 1 commit into
Conversation
Replace the B1 `catalog` stub with a working spine bookkeeping verb backed by
the pulse repertoire (~/.amico/vaults/armonissima/catalog/pulses/<id>/metadata.toml,
the amico-catalog skill's Phase-0 schema). Two subcommands, both deterministic
filesystem work callable via bash by either runtime, the harness, or cron/CI:
amico catalog query --platform <p> --kind <g>
→ the incumbent pulse metadata for (platform, gate) + the ranked candidate
list (fidelity desc; ties broken by shorter duration). This is the
warm-start lookup the interview does before authoring a solve.
amico catalog ingest --platform <p> --kind <g> [--from-run <dir>]
[--artifact <file.jld2>] [--fidelity <f>] [--agree …] …
→ the PROMOTION path, GATED on verification.agree (matching the existing
semantics — a run is promotable only when the independent re-rollout
agreed: verification.toml `agree = true`; --from-run reads it, or pass
--agree explicitly). When gated open it promotes iff the candidate beats
the incumbent (amico-catalog Version rule), writing a new
{platform}-{kind}-v{N+1} entry (metadata.toml + copied pulse.jld2) with
`warm_start` lineage back to the incumbent. agree≠true → blocked (64);
no beat → no-op (0); promoted → 0.
Design notes:
- Pure core in repertoire.ts (loaders never throw; a corrupt/missing catalog
degrades to empty, like src/catalog.ts's template/exemplar loaders); the verb
body (arg parsing + writes) in catalog_verb.ts. verbs.ts wires catalog.run to
it and marks it non-stub; vault/device/note stay B1 stubs. One impl backs both
the CLI (amico.ts) and the mcp-serve facade (unchanged).
- $AMICO_CATALOG_DIR overrides the pulses dir (tests point it at a temp catalog).
- FLAG NAMES honor the S31 guard (test/s31.test.ts bans the physics-knob
double-dash flags gate/pulse/system in src/): the gate discriminator is `--kind`
(issue #111's surface, maps to the `gate` field) and the pulse-artifact PATH is
`--artifact` (a file path, not a physics knob — same category as spec/from-run).
Tests: repertoire pure logic + query/ingest through the dist/amico.js bundle
(mirrors amico.test.ts / subcommands.test.ts); amico.test.ts's stub loop drops
catalog (now real) and asserts it routes to query/ingest. amico-run 141 green,
extension fast suite 435 green. Stacks on #118 (B1).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This was referenced Jul 9, 2026
Member
|
Closing — this is already delivered. The work is on
This PR targeted Branch preserved. |
This was referenced Jul 28, 2026
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.
Closes #111. Stacks on #118 (B1 — the
amicoverb router); base branch isb1-amico-cli-router, notmain. Review/merge #118 first.What this does
Replaces B1's
catalogstub with a working spine bookkeeping verb backed by the pulse repertoire —~/.amico/vaults/armonissima/catalog/pulses/<id>/metadata.toml(the amico-catalog skill's Phase-0 schema). Both subcommands are deterministic filesystem work, callable via bash by either runtime, the harness, or cron/CI:amico catalog query --platform <p> --kind <g>→ the incumbent pulse metadata for(platform, gate)plus the ranked candidate list (fidelity desc; ties broken by shorter duration). This is the warm-start lookup the interview does before authoring a solve.amico catalog ingest --platform <p> --kind <g> [--from-run <dir>] [--artifact <file.jld2>] [--fidelity <f>] [--agree true|false] …→ the promotion path, gated onverification.agree(matching the existing semantics — a run is promotable only when the independent re-rollout agreed:verification.tomlagree = true).--from-run <dir>readsverification.toml(agree) +result.toml(fidelity) + defaults the artifact to<dir>/pulse.jld2; or pass--agree/--fidelity/--artifactexplicitly. When gated open it promotes iff the candidate beats the incumbent (amico-catalog Version rule), writing a new{platform}-{kind}-v{N+1}entry (metadata.toml+ copiedpulse.jld2) withwarm_startlineage back to the incumbent.Exit codes follow the verb convention:
agree ≠ true→ blocked (64); verified but no beat → no-op (0); promoted → 0; usage/missing-artifact → 64.Design
repertoire.ts(loaders never throw — a corrupt/missing catalog degrades to empty, likesrc/catalog.ts's template/exemplar loaders); the verb body (arg parsing + writes) incatalog_verb.ts.verbs.tswirescatalog.runto it and marks it non-stub (astub?flag so--helpdrops the[stub → …]tag for catalog only);vault/device/notestay B1 stubs. One impl backs both the CLI (amico.ts) and themcp-servefacade (unchanged).$AMICO_CATALOG_DIRoverrides the pulses dir (tests point it at a temp catalog).Flag-name note (S31 guard) — reviewer decision point
test/s31.test.tsbans the physics-knob double-dash flags (gate/pulse/system) anywhere insrc/. So the gate discriminator is--kind(issue #111's acceptance surface; maps onto the repertoire'sgatefield), and the pulse-artifact path is--artifactrather than the issue's literal--pulse— a pulse-file path is not a physics knob (same category as--spec/--from-run), so it takes a non-colliding name. If you'd rather keep the literal--pulse, the alternative is an explicit, reviewed S31 carve-out amendment (the precedentmcp_serve.tscites for spec C).Tests
test/repertoire.test.ts-style pure-logic tests +query/ingestthrough thedist/amico.jsbundle (test/catalog_verb.test.ts, 19 tests), mirroringamico.test.ts/subcommands.test.ts.amico.test.ts's stub loop dropscatalog(now real) and asserts it routes toquery/ingest; vault/device/note still asserted as stubs.Integration follow-up (out of scope here, per the slice)
This slice lands the CLI verb + tests only; it does not rewire the extension/interview. The remaining plugin→CLI migration: today the opencode interview has no
amicode_catalogplugin tool (warm-start lookup is currently done ad hoc / not wired to the repertoire), and promotion lives in the extension's manual "Save pulse to catalog" quick-pick (run_controls.catalogPulsesDir). Issue #111's second acceptance box — "opencode interview does warm-start lookups via the CLI verb (bash)" — means wiring the interview's warm-start step to shell out toamico catalog query(and, optionally, routing promotion throughamico catalog ingestso theverification.agreegate is enforced in one place). That belongs in the extensionscores//plugin wiring, not amico-run, and should be its own slice/PR so this one stays reviewable.Note: fork CI may be RED (pre-existing private-fork vendored-binary token issue), unrelated to this change.
🤖 Generated with Claude Code