Summary
A manifest change made inside the rolling main.tar.gz (e.g. flipping a status: field) does not bust the agent-install tarball cache, because the cache key only rotates when registry-index.json changes. So users who cached main.tar.gz before the manifest change keep installing the stale manifest indefinitely (no TTL on the tarball cache). This is the residual case that #254's content-fingerprint fix does not cover.
Concrete, reproduced repro (live)
#269 flipped 20-agents/_core/file/manifest.yaml status: planned → available (2026-06-25) but did not touch registry-index.json (last changed by #257, 2026-06-18). On a machine whose ~/.aware/cache/agents/tarball-<sha>.tar.gz was cached on 2026-06-18:
$ aware agent install file
✓ installed file
$ grep '^status:' ~/.aware/agents/file/manifest.yaml
status: planned # ← STALE (main has `available`)
$ aware app run <app-with-a-file/write-node>
error: node "w" references agent "file", which is declared but not yet runnable
(no shipped/installable transport binary)
error: validation failed: [E_APP_AGENT_UNAVAILABLE]
# purge the URL+fingerprint-keyed tarball cache, reinstall:
$ rm ~/.aware/cache/agents/tarball-*.tar.gz && aware agent uninstall file && aware agent install file
$ grep '^status:' ~/.aware/agents/file/manifest.yaml
status: available # ← correct; app run then works
The file/write/write-csv verbs are wired in-process (#268) and aware agent invoke file write-csv works — only aware app run's validate gate rejects the stale-planned manifest. So the binary is fine; the manifest delivery is stale.
Root cause (file:line)
cli/src/install/registry.rs:58 — tarball cache file = tarball-{sha256(tarball_url + index.snapshot_fingerprint())}.tar.gz.
cli/src/registry/index.rs snapshot_fingerprint() hashes the serialized index (registry-index.json). A change inside main.tar.gz that leaves registry-index.json byte-identical produces the same fingerprint → same cache filename → the stale archive is reused (registry.rs:63 if cache_file.is_file() { copy }).
- The tarball cache has no TTL (unlike the index/catalog, which carry a 1h TTL in
cli/src/registry/fetch.rs:19).
The code comment at registry.rs:48-57 already anticipates this: updated-at is "the registry's manual refresh lever" — but nothing bumps it when a manifest inside the tarball changes, so the lever is never pulled.
Impact
Any manifest edit that ships via the rolling main.tar.gz without an accompanying registry-index.json change (status flips, description/keyword fixes, input/output schema tweaks) silently fails to reach users with a warm cache. The file agent is a live example — it breaks file/write apps with a confusing E_APP_AGENT_UNAVAILABLE even though the runtime supports the verb.
Suggested fixes (pick one)
- Auto-bump
registry-index.json updated-at in CI/release whenever any 20-agents/**/manifest.yaml changes (or on every release tag) — pulls the documented lever automatically.
- Add a TTL to the tarball cache mirroring the index's 1h TTL (
fetch.rs:19), so a warm cache self-refreshes (bounded re-download, not per-agent).
- Key the cache on the archive's real content (ETag / commit SHA of
refs/heads/main) instead of the index fingerprint.
Mitigation already applied
PR # bumps updated-at now so the current stale file caches bust on the next install (live, 1h TTL). That's a one-off; this issue tracks the systemic fix so it can't recur.
Cross-ref: #254 (the prior fingerprint fix this is a residual of), #268/#269 (the file agent), #243 (the per-agent re-download optimization the shared cache serves).
Summary
A manifest change made inside the rolling
main.tar.gz(e.g. flipping astatus:field) does not bust the agent-install tarball cache, because the cache key only rotates whenregistry-index.jsonchanges. So users who cachedmain.tar.gzbefore the manifest change keep installing the stale manifest indefinitely (no TTL on the tarball cache). This is the residual case that #254's content-fingerprint fix does not cover.Concrete, reproduced repro (live)
#269 flipped
20-agents/_core/file/manifest.yamlstatus: planned → available(2026-06-25) but did not touchregistry-index.json(last changed by #257, 2026-06-18). On a machine whose~/.aware/cache/agents/tarball-<sha>.tar.gzwas cached on 2026-06-18:The
file/write/write-csvverbs are wired in-process (#268) andaware agent invoke file write-csvworks — onlyaware app run's validate gate rejects the stale-plannedmanifest. So the binary is fine; the manifest delivery is stale.Root cause (file:line)
cli/src/install/registry.rs:58— tarball cache file =tarball-{sha256(tarball_url + index.snapshot_fingerprint())}.tar.gz.cli/src/registry/index.rssnapshot_fingerprint()hashes the serialized index (registry-index.json). A change insidemain.tar.gzthat leavesregistry-index.jsonbyte-identical produces the same fingerprint → same cache filename → the stale archive is reused (registry.rs:63if cache_file.is_file() { copy }).cli/src/registry/fetch.rs:19).The code comment at
registry.rs:48-57already anticipates this:updated-atis "the registry's manual refresh lever" — but nothing bumps it when a manifest inside the tarball changes, so the lever is never pulled.Impact
Any manifest edit that ships via the rolling
main.tar.gzwithout an accompanyingregistry-index.jsonchange (status flips, description/keyword fixes, input/output schema tweaks) silently fails to reach users with a warm cache. Thefileagent is a live example — it breaksfile/writeapps with a confusingE_APP_AGENT_UNAVAILABLEeven though the runtime supports the verb.Suggested fixes (pick one)
registry-index.jsonupdated-atin CI/release whenever any20-agents/**/manifest.yamlchanges (or on every release tag) — pulls the documented lever automatically.fetch.rs:19), so a warm cache self-refreshes (bounded re-download, not per-agent).refs/heads/main) instead of the index fingerprint.Mitigation already applied
PR # bumps
updated-atnow so the current stalefilecaches bust on the next install (live, 1h TTL). That's a one-off; this issue tracks the systemic fix so it can't recur.Cross-ref: #254 (the prior fingerprint fix this is a residual of), #268/#269 (the file agent), #243 (the per-agent re-download optimization the shared cache serves).