diff --git a/docs/plans/2026-04-26-authforge-implementation.md b/docs/plans/2026-04-26-authforge-implementation.md index 1c0276b..a550c74 100644 --- a/docs/plans/2026-04-26-authforge-implementation.md +++ b/docs/plans/2026-04-26-authforge-implementation.md @@ -79,14 +79,13 @@ The phase numbering is a dependency-respecting ordering, **not** a serial schedu ↓ ↓ ┌──────────────┬────────────┐ │ │ │ - Phase 9 + 12-GUI Phase 11 Phase 10 - policy + recovery TOTP first-login (needs 6 ✓ + 8 ✓) - tabs (open) (open) (open) + Phase 9 + 12-GUI ✅ Phase 11 ✅ Phase 10 ✅ + policy + recovery TOTP first-login modal │ │ │ └──────────────┴────────────┘ ↓ - Phase 13 - deb finalization (needs every binary) + Phase 13 ← OPEN NEXT + deb finalization (every binary built) ↓ Phase 14 Launchpad PPA (VM smoke gate for "Code complete" phases) @@ -101,19 +100,13 @@ The phase numbering is a dependency-respecting ordering, **not** a serial schedu v1.0 release ``` -### What's parallel-safe right now (post-Phase 8 + Phase 12 backend) +### What's open right now (post-Phase 11 merge) -Three lanes are open and touch disjoint file trees: +All parallelism wins have been collected — Phases 9, 10, 11, and the Phase 12 GUI tab merged on 2026-04-27 via the prep-lane + 3-worktree fanout described at [2026-04-27-parallel-fanout-9-10-11.md](2026-04-27-parallel-fanout-9-10-11.md). What remains is the sequential tail. -| Lane | Phases | Touches | Why parallel-safe | -|---|---|---|---| -| **GUI policy + recovery** | 9 + 12 GUI tab | `gui/src/{app_context,policy_form,policy_page,recovery_page}.rs` (new), additive bus.rs methods, ViewStack tabs in `main.rs` | Both views consume the typed D-Bus contract that landed with Phases 8 + 12 backend. AppContext refactor was foreseen by Phase 8's Task 7. Plan: [2026-04-27-phase-9-and-12-gui.md](2026-04-27-phase-9-and-12-gui.md). | -| **TOTP** | 11 | `daemon/src/totp/` (new), `gui/src/totp_page.rs` (new), `debian/control` Recommends | Feature-flagged at build time. Phase 8 ✓ unblocked the GUI tab; daemon-side TOTP module is brand-new. Step-level plan still to be written. | -| **First-login** | 10 | `gui/src/firstrun.rs` (new), `gui/data/authforge-firstrun.desktop`, `--first-run` CLI flag in `gui/src/main.rs` | Both Phase 6 ✓ (PAM pending blocker) and Phase 8 ✓ (GUI shell) are in. Step-level plan still to be written. | +### Sequential tail -### Sequential tail (no parallelism wins) - -Phase 13 (deb finalization) needs every binary built — opens once Phases 9, 10, 11 land. Phase 14 (PPA) chains off 13 — and is the **VM smoke gate** for everything currently in "Code complete" status (1, 3, 4, 6, 8, 12 — six phases with deferred real-hardware/root-write/libargon2-dev gates). Phase 17 (integration tests) chains off 14. Phase 18 (user docs) and R (release) follow. +Phase 13 (deb finalization) is now open — every binary it packages is built. Phase 14 (PPA) chains off 13 and is the **VM smoke gate** for the remaining "Code complete" deferrals: Phase 1 (5-deb output from `debuild`), Phase 3 (real Yubikey enrollment), Phase 4 (`pam-auth-update --package` against a real `/etc/pam.d/`), Phase 8 (GUI walkthrough w/ Yubikey), Phase 10 (Flow C autostart + watchdog), Phase 11 (`pam_google_authenticator` 6-digit verify with a real authenticator app). Phase 6 + Phase 12-backend's `pamtester` recipes (smoke tests 1–3 in `pam/TESTING.md`) were verified locally on 2026-04-27 once `libargon2-dev` + `pamtester` were installed; smoke test 4 (recovery-code path with the daemon running) remains for Phase 14. Phase 17 (integration tests) chains off 14 — also lands the `safe_user` canonicalize-then-verify hardening flagged in `pam/TESTING.md`. Phase 18 (user docs) and R (release) follow. ### Lessons learned from this session's parallelism @@ -121,6 +114,7 @@ Phase 13 (deb finalization) needs every binary built — opens once Phases 9, 10 - **They don't work** when the harness sandbox blocks `desktop-file-validate` / `dpkg-checkbuilddeps` / `ansible-lint` — the Phase 15+16 agents both reported these as "skipped, hand-checked." Verification slips through to manual review of the diff. Acceptable for data/config phases; risky for code phases without strong test coverage. - **Phase 4+5 had to land together** because both modify the SetPolicy code path; splitting them creates a window where SetPolicy applies without a lockout pre-check. - **Worktrees share `target/` if and only if you don't isolate** via `CARGO_TARGET_DIR`. We didn't need to — each `git worktree add` produces its own working tree, so cargo target dirs are per-worktree by default. Concurrent cargo runs across worktrees would still race on the global `~/.cargo/registry` cargo lock, but in practice that's a brief synchronization, not a hang. +- **Three-lane fanout (Phases 9 / 10 / 11) needed a prep lane first.** A naive "branch off main, dispatch three subagents" plan hit a hard wall — every lane wanted to edit `gui/src/main.rs`, two wanted `daemon/src/{dbus,state}.rs`. Splitting out a prep lane (`AppContext` refactor + `--first-run` flag scaffold + daemon `GetPendingStatus` method) and merging it first made the three follow-on lanes file-disjoint. Coordinator doc at [2026-04-27-parallel-fanout-9-10-11.md](2026-04-27-parallel-fanout-9-10-11.md). Wall-clock from prep merge to all three lanes merged: ~90 minutes including a doc-conflict resolution on the Phase 9-vs-Phase 10 closeout and an interrupt-and-resume cycle when one agent stalled mid-Task-7. ---