Skip to content

Backlog batch: real tombstones, vault wiring, config command, search tag parity#26

Merged
Ghost-Frame merged 4 commits into
mainfrom
feat/backlog-batch
Jul 12, 2026
Merged

Backlog batch: real tombstones, vault wiring, config command, search tag parity#26
Ghost-Frame merged 4 commits into
mainfrom
feat/backlog-batch

Conversation

@Ghost-Frame

Copy link
Copy Markdown
Owner

Summary

Four logical commits clearing the post-launch backlog.

  • catalog: tombstones now affect reads. tombstone_pack recomputes the head's latest_version to the newest remaining Active version (shared semver comparator, no drift) and clears it when none remain; search excludes packs with no resolvable latest in every branch including trending, which previously had zero tombstone exclusion. Versions routes deliberately keep returning tombstoned records with visible status, and the trait docs now say so instead of claiming otherwise.
  • vault: the dormant vault subsystem is live. frameshift vault init/set/get/rm/list manages an age-encrypted per-project vault; packs shipping pack.template.toml get declared {{tokens}} filled at render time, with all missing required tokens named in a single typed error. The client library never prompts (opt-in VaultProvider; daemon/MCP are env-only). Packs without the manifest render byte-identically to before, enforced by a regression test.
  • cli/mcp: frameshift config get/set for telemetry_opt_in; grow append --global makes global-scope summaries real; MCP frameshift_search gains the CLI's tag filter.
  • conformance: dead evaluate_upgrade/GateDecision removed; evaluate_cross_version is the only gate.

Verification

  • cargo fmt --all: clean
  • cargo clippy --workspace --all-targets -- -D warnings: clean
  • cargo test --workspace: 780 tests, 0 failures

tombstone_pack now recomputes the pack head's latest_version to the
newest remaining Active version (same semver_gt comparator
register_pack_version uses, now pub so postgres and the test mock
share it), clearing it when none remain. Search excludes packs with
no resolvable latest in every query branch, including trending, which
previously had no tombstone exclusion at all. Trait docs rewritten to
match reality: search documents the latest_version mechanism, the
versions routes document that they deliberately return tombstoned
records with status visible. Covered by three router-level
integration tests plus mirrored docker-gated postgres tests.
evaluate_upgrade and GateDecision had no callers outside their own
unit tests; evaluate_cross_version is the live gate. Module docs and
re-exports updated.
frameshift config get/set exposes telemetry_opt_in (allowlisted keys,
strict booleans, creates config.toml on first set) so opting in no
longer means hand-editing TOML. grow append --global writes a
structured Global-scope entry so grow summary --scope global stops
summarizing an empty set. The MCP frameshift_search tool gains the
CLI's tag filter.
The vault subsystem (trait, schema, age/scrypt local backend,
template tokens) was fully built with zero callers. frameshift vault
init/set/get/rm/list now manages a per-project vault.age in the
central store; the passphrase comes from FRAMESHIFT_VAULT_PASSPHRASE
or a hidden prompt (CLI only). The client gains an opt-in
VaultProvider -- the library never prompts; daemon and MCP wire
env-only providers. Packs that ship pack.template.toml get their
declared {{tokens}} substituted at render time from the vault, with
every missing required token named in one typed error before any
output is written. Packs without the manifest render byte-identically
to before -- covered by a regression test -- so nothing changes for
any existing pack. Vault and template errors are boxed to keep
ClientError small per the existing Compose precedent.
@Ghost-Frame
Ghost-Frame merged commit bf2e241 into main Jul 12, 2026
5 checks passed
@Ghost-Frame
Ghost-Frame deleted the feat/backlog-batch branch July 12, 2026 21:32
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