You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
## Summary
The two **corrective musts** from the v0.2 maintenance roadmap.
Closes#12 · Closes#13.
### #12 — transitive-import closure hashing (the real fix)
`proven` invalidation hashed a file's own bytes only, so a promoted file
whose **dependency** changed upstream stayed green in `proven/` while
logically broken — exactly the silent-failure class arghda exists to
catch.
Now, when a workspace declares a source tree (`[proven] include_root` in
`.arghda/config.toml`), promotion records a **closure hash** (the file +
every transitive import that resolves in-tree, deterministic order), and
`stale` re-checks it — distinguishing `content changed since promotion`
from `a transitive import changed since promotion`.
Design keeps it backward-compatible and low-blast-radius: the include
root is a **workspace property**, so `transition`/`stale_proven`
signatures are unchanged, existing call sites and tests are untouched,
and older `hashes.json` manifests still load (`closure_sha256` is
optional).
### #13 — cycle-safety regression test
On inspection, `graph::transitive_imports` is **already** cycle-safe
(the `reachable` visited-set prevents re-traversal) and `build` is a
flat pass — so the survey's "infinite-loop risk" was overstated. Rather
than invent a fix for a bug that isn't there, this pins the property
with a regression test (A↔B fixture terminates), guarding against a
refactor reintroducing a loop — relevant because `watch` runs over
`working/`, where half-edited files can transiently form a cycle.
## Changes
- `src/proven.rs` — `closure_hash()`; `ProvenRecord.closure_sha256`
(optional).
- `src/config.rs` — `[proven] include_root` knob +
`proven_include_root()` (relative paths resolved against the workspace).
- `src/workspace.rs` — record closure on promotion; richer stale reason.
- `src/graph.rs` — cycle-termination regression test.
- `tests/proven.rs` — end-to-end transitive-staleness test.
- `STATE.a2ml` — content-hash milestone 75% → 100%.
## Verification
Full CI gate green locally: `cargo fmt --check`, `cargo build
--all-targets`, `cargo test` (50 unit + integration, incl. the 4 new
tests), `cargo clippy --all-targets -- -D warnings`, SPDX invariant.
## Context
First two items of the corrective/adaptive/perfective backlog filed as
#12–#25. Remaining corrective follow-ups: #14 (parser resilience), #15
(timestamp KATs).
🤖 Generated with [Claude Code](https://claude.com/claude-code)
https://claude.ai/code/session_019GiSiEfgZCte35dyykgBHs
---
_Generated by [Claude
Code](https://claude.ai/code/session_019GiSiEfgZCte35dyykgBHs)_
{ name = "Groove service manifest (/.well-known/groove) for PanLL discovery", completion = 0 },
@@ -40,8 +40,8 @@ milestones = [
40
40
41
41
[critical-next-actions]
42
42
actions = [
43
-
"Template-applicability: rsr-profile.a2ml declares preset rust-cli (landed); estate policy + gate model + reference checker filed in hyperpolymath/standards#391. Follow-up: wire scripts/check-rsr-profile.sh into CI once standards#391 lands.",
44
-
"Extend content-hash invalidation to cover transitive imports (needs include-root tracking)",
43
+
"Template-applicability: rsr-profile.a2ml declares capabilities (landed); estate policy + gate model + reference checker landed in hyperpolymath/standards#391 + #392 (pure capability-gating). Follow-up: wire the standards rsr-profile check into CI.",
44
+
"Transitive-import closure hashing landed (workspace [proven] include_root); follow-up: also expose it as a --include-root CLI flag on promote/stale.",
45
45
"Serve /.well-known/groove for PanLL discovery (Groove protocol)",
46
46
"Scaffold arghda-studio (AffineScript visual layer consuming the dag JSON)",
0 commit comments