- Decision: build a standalone monorepo-style workspace at
/var/mnt/eclipse/repos/invariant-path. - Tradeoff: wrappers in
echidna,panll, andhypatiacall the shared CLI instead of duplicating logic. - Reasoning: this keeps heuristics inspectable and consistent while still enabling repo-specific usage patterns.
- Decision: favor strict trigger-based extraction with explicit transition markers.
- Tradeoff: we intentionally accept false negatives to reduce annotation noise.
- Reasoning: contributors can always add/edit annotations manually; noisy auto-suggestions hurt trust.
- Decision: use append-friendly JSONL (
annotations.jsonl) with upsert-on-write semantics. - Tradeoff: not ideal for very large datasets, but easy to inspect and diff in git.
- Reasoning: MVP prioritizes transparency and editability over throughput.
- Decision: each target repo (
echidna,panll,hypatia) gets a tiny shell wrapper that injects a default--profileforscan. - Tradeoff: wrappers rely on local path
../invariant-pathandcargo run, not a globally installed binary. - Reasoning: fastest path to real usage across multiple repos while preserving one shared implementation.
- Decision: map core UX actions directly to commands:
accept,dismiss,clarify,add,update, plusoverlay toggle. - Tradeoff: no rich side panel UI in MVP; interaction is CLI-first with JSON output.
- Reasoning: preserves complete editability and auditability while keeping implementation small.
- Decision: add a shared launcher at
/var/mnt/eclipse/repos/.desktop-tools/invariant-path-launcher.shplus an install script that writes.desktopentries to start menu and desktop locations. - Tradeoff: launcher defaults to CLI-friendly
Terminal=truebecause Invariant Path is currently a CLI-first tool. - Reasoning: satisfies immediate usability from Start Menu, desktop, and repo-root without introducing an incomplete GUI overlay.
- Decision: expose
invariant-pathentry points in each integrated repo throughscripts/invariant-path.shandjust invariant-path .... - Tradeoff: requires shared workspace path
../invariant-pathto exist. - Reasoning: keeps behavior consistent across repos while preserving a single source of truth for extractor/classifier logic.
- Decision: make
scripts/install-desktop.shremove a destination.desktopfile if it exists but is not writable, then reinstall with deterministic modes (444in app menu,555on Desktop/Shortcuts). - Tradeoff: replacement is explicit rather than in-place update, but content and permissions remain deterministic from template + destination policy.
- Reasoning: GNU
installcan fail on existing read-only targets; KDE/Plasma desktop launchers also need execute bits to avoid launch aborts.
- Decision: add a
facesprofile (profiles/faces.md), a same-cube corpus (examples/same-cube/), and a verifier (scripts/verify-same-cube.sh) that grounds the AffineScript "different faces, same cube" invariant — every face'spreview-*lowering must normalise to the same canonical text. - Tradeoff: v1 compares normalised canonical text, not ASTs, and SKIPs when no
affinescriptbinary is reachable (grounding happens in CI). It can't yet catch two different canonical texts that typecheck to the same cube. - Reasoning: per-face snapshot tests (
affinescript/tests/faces/) catch drift within a face but never compare face A's cube against face B's. The cross-face equality is the load-bearing claim; this profile is the claim-path debugger that locates which face breaks it. Doc-profile shape (markdown + script), so no change to the Rust core or CLI — consistent with thepmpl/standards-docsprofiles.