Roadmap Status & Milestone Gap Analysis¶
Analysis date: 2026-07-17. Compares the 2026-07-09 ROADMAP.md against the current
tree (branch roadmap-milestone-readonly-scan, forked from
wip-checkpoint-2026-07-16). A week of commits landed after the roadmap was
written, so several P0 items are already substantially addressed.
This document scopes work to the roadmap's own Recommended first milestone — a trustworthy read-only scan — because the full roadmap contains items no automated pass can complete (real cryptographic trust roots with human key custody, multi-platform CI on real hardware, SBOM / signed release artifacts, Android/iOS companion apps). Those are itemized as "human/infra required" below.
P0 status (after this branch's work)¶
| # | Item | Status | Notes |
|---|---|---|---|
| 1 | Package omits runtime content | DONE ✓verified | setup.py ships modules/ profiles/ guides/ as data_files. Verified: clean-venv pip install ., then installed rescue (run from outside the source tree) discovered profiles and ran a read-only disk_space check end-to-end. |
| 2 | Content updates don't activate | DONE | repo.checkout atomically writes the .git/rescue-applied-head marker; runtime.active_content_root() gates on it and content_directory/file prefer applied content. Data content is updatable; Python modules stay bundled by design. Covered by test_runtime.py + update/test_engine.py. Retained-previous-version rollback is git-history only (see remainder). |
| 3 | Trust config is placeholder | SOFTWARE DONE / KEYS HUMAN | validate_trusted_signers rejects REPLACE_WITH_.../missing keys and the update engine enforces it on construction (test_default_trust_configuration_rejects_placeholder_keys). Real key material + rotation remain a human/org task. |
| 4 | Self-integrity non-blocking | DONE | integrity.py fails on added/modified/missing files. Manifest regenerated on this branch; verifies clean. |
| 5 | SAFE ≠ safe for auto | DONE | ModuleBase.auto_apply (default False) makes auto mode read-only; a fix is auto-applied only if a module opts in AND is SAFE. Nothing opts in yet → auto is fully read-only. |
| 6 | Advice vs remediation blurred | DONE (core) | FixResult.executed_mutations/guidance_actions: guidance never counts as a system change. CLI auto summary reports system changes vs manual actions separately. Per-module fix() audit for remaining edge cases is follow-up. |
| 7 | Checks can hang / no bounds | DONE (orchestrator) / migration follow-up | rescue/command.py (timeout+output cap), rescue/fsbounds.py (bounded_walk), orchestrator per-module timeout + session budget with daemon-thread isolation. Migrating all ~744 in-module subprocess.run sites to the runner is a large mechanical follow-up. |
| 8 | security-reset profile nonfunctional | DONE | Profile references only registered modules; misleading "Automates…" description corrected. Whole-catalog validation test (test_all_shipped_content.py) fails on any missing module/guide across all profiles. |
| 9 | Linux advertised but can't run | DONE | profiler/linux.py implemented; gather_profile() dispatches to it. |
| 10 | Discovery executes arbitrary Python | PHASE-4 | Registry still imports every module in-process. Process isolation is a Phase-4 architecture change; out of milestone scope. |
Milestone work delivered (this branch)¶
The "trustworthy read-only scan" milestone is met. Delivered on
roadmap-milestone-readonly-scan:
- Test determinism — full suite runs to completion (no stall in
test_module_ai_threat_indicators); baseline captured (3094 passing before this branch's additions). - Bounded execution (P0#7) —
rescue/command.py,rescue/fsbounds.py, orchestrator per-module timeout + session budget. New tests:test_command.py,test_fsbounds.py,test_orchestrator_bounds.py. - Package data (P0#1) — verified end to end via clean-venv
pip install .. - Profile validation (P0#8) —
test_all_shipped_content.pyguards every shipped profile + guide; misleading profile description corrected. - Action semantics (P0#5/#6) — read-only-by-default auto mode
(
auto_apply), guidance-vs-mutation accounting.test_action_semantics.py. - Richer result schema (P1#1) —
CheckStatus,supported/unsupported_reason,Finding.confidence.test_result_schema.py. - Integrity (P0#4) — manifest regenerated; verifies clean.
Each landed as its own commit with tests.
Remainder — needs human/infra decisions or is later-phase (report to human)¶
Requires a human or organization (cannot be done by a coding pass): - P0#3: real signer key material, custody, rotation, revocation, threshold approvals, and the release-signing procedure. (Software guards are in place.) - Phase 3: platform CI / smoke tests on real macOS Intel + Apple Silicon + Windows + Linux at standard and elevated privilege. - Phase 4: SBOMs, reproducible + signed release artifacts, dependency scanning. - Android/iOS companion workflows; vendor hardware-diagnostic adapters.
Large, mechanical, or later-phase engineering follow-ups (scoped, not blocking
the read-only milestone):
- P0#7 migration: route all ~744 in-module subprocess.run calls through
rescue.command.run, then prohibit direct subprocess in modules. The
orchestrator now bounds the session; per-call timeouts still want migrating.
- P0#10: run module discovery/analysis in a constrained subprocess instead of
importing arbitrary Python in-process (Phase 4 architecture change).
- P0#2 rollback: retain the previous applied content version for one-step
rollback (currently rollback is via git history).
- P0#6 audit: sweep every module fix() so any remaining "instruction marked
successful" cases use ActionKind.GUIDANCE.
- P1#1 population: have modules populate confidence, collected_at, and
supported/unsupported_reason (schema is in place; most modules not yet
migrated). Add a rescue-case export (P1#2) and CI registry-metadata
validation (P1#3).
How to verify this milestone¶
python -m pytest -q # full suite is deterministic & green
python -m venv /tmp/rv && /tmp/rv/bin/pip install .
cd /tmp && /tmp/rv/bin/rescue profiles # discovers shipped content
/tmp/rv/bin/rescue run disk_space --yes # end-to-end read-only check
python scripts/generate_integrity_manifest.py # then startup verifies clean
Update — 2026-08-05: branch consolidation, audit, and planned modules¶
This section corrects several claims above that did not hold on main, and
records what changed. Where an earlier claim was wrong, it is called out rather
than quietly edited, because "we verified this" appearing next to something
untrue is the failure mode worth avoiding.
Corrections to the status above¶
P0#4 (self-integrity) was recorded as "DONE — manifest regenerated; verifies
clean". It did not verify clean on main. verify_package_integrity reported
8 tampered and 5 added files, so startup verification failed and every launch
printed a tamper warning. The regeneration was real, but it happened on a
different lineage; main's own commits then added remediation.py,
serialize.py, threat_map.py, and two TUI screens without regenerating.
Regenerated here, and it now verifies clean.
P0#8 (security-reset profile) was recorded as DONE. It was made valid by
deleting the references to password_manager_check, twofa_audit, and
session_revocation_scan — the profile stopped naming modules that did not
exist, but the capability was never built. Those three modules now exist and the
profile references them again.
The test-suite baseline was recorded as "3094 passing". The suite was not green: it was 64 failed / 3341 passed, and one file did not even parse under the declared minimum Python. See below.
Python version support was broken, not partially broken¶
pyproject.toml declares requires-python = ">=3.11". On 3.11:
- 3 files failed to parse at all (PEP 701 nested-quote f-strings, and a backslash inside an f-string expression). Two were shipped modules, so module discovery broke.
- 30 call sites across 16 modules passed
follow_symlinks=topathlib.Path.is_file()/is_dir(). That keyword arrived in 3.13, so every one raisedTypeErrorat runtime. Those modules did not work on two of the three supported versions.
Both are fixed; rescue.fsbounds now exposes is_file_nofollow /
is_dir_nofollow with the same semantics on every supported version.
Nothing was catching this. There is no .github/ directory and no CI. A
matrix that actually ran the suite on 3.11 would have caught the largest defect
in the tree. This is the highest-value remaining infrastructure gap.
The 64 failures were environment coupling, not flakiness¶
Every one was a test that silently depended on the machine it ran on, so the suite only passed on one developer's macOS box:
- Modules that check a real path under
~/Libraryor/Libraryand return early if absent, socheck()short-circuited before the mocked subprocess was reached (notification_center_check,kext_audit,appleid_security_check). - A time bomb:
win_safe_mode_checkused absolute dates chosen to be "5 days ago" when written. Real time moved past them and the fixture aged into a30-day uptime, tripping the warning it asserts is absent.
disk_permissions_repairasserted ownership against a hardcoded uid 501, so it only passed as a typical macOS user account.test_cli_scan_jsonusedCliRunner(mix_stderr=...), removed in click 8.2.update/test_verifysigned a tag without pinninggpg.format, so on a host configured for SSH commit signing it produced an SSH signature while asserting on the GPG path. No trust check was weakened to green this; the verification code was correct and only the test changed.
The pattern is now a convention: a module's traversal roots are class attributes so tests can point them at a fixture tree.
Full suite: 3503 passed, 0 failed.
Planned modules — resolved¶
"Planned but missing" was resolved against the roadmap, not guessed. Profiles,
guides, and the threat map reference no missing modules, and every module named
in docs/superpowers/plans/ exists. Two sources yielded real gaps, both now
closed:
| Module | Source | Why it exists |
|---|---|---|
password_manager_check |
P0#8 | Named, never built |
twofa_audit |
P0#8 | Named, never built |
session_revocation_scan |
P0#8 | Named, never built |
code_signature_audit |
P2 "Trust and reputation verification" | No signature validation existed |
security_baseline_diff |
P2 "Baselines and differential scans" | No baseline capability existed |
evidence_bundle |
P2 "Evidence collection and forensic handoff" | Nothing preserved evidence before repair |
Registry now discovers 278 modules. The remaining P2 rows are framework- or guide-level rather than module-shaped (transactional remediation, offline and bootable recovery, incident triage), or already have substantial module coverage (backup validation, hardware recovery), and are deliberately out of scope here.
Remaining work, with current numbers¶
These were already recorded above as follow-ups. The counts have grown since the roadmap was written, which is worth knowing before scheduling them:
- P0#7 command-runner migration has not started. 756
subprocess.runcalls in modules, 0 routed throughrescue.command.run, 435 with no timeout. The roadmap counted 744 and 395. - Remediation codes are ~38% migrated. 169 of 272 pre-existing modules
declare no
emits_codes; 30% ofFinding()constructions setcode=. (tests/test_module_code_consistency.pydoes guard the ones that do.) - No CI, as above.
Verified healthy, for balance: auto_apply = True appears in zero modules,
so auto mode genuinely is read-only as P0#5 intends; there are no
NotImplementedError stubs or placeholder TODOs; the only skipped tests are
correctly conditional on gpg being available; and both setup.py and
rescue.spec glob the content directories, so new modules ship without
packaging changes.