Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
93 changes: 53 additions & 40 deletions docs/plans/2026-07-16-001-three-project-parity-architecture-plan.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,16 +48,17 @@ parity references.
- Vision: `docs/knowledgebase/product-vision.md` (vision vs current state)
- Competitor probe: `docs/knowledgebase/nxm-protocol-handler.md` (MO2 / Vortex / ModSync)

### Related open PRs (2026-07-16 snapshot)
### Related PRs (refreshed 2026-07-17 / U7)

| PR | State | Relevance |
|----|-------|-----------|
| [#168](https://github.com/th3w1zard1/ModSync/pull/168) | OPEN | Managed deployment install wiring (Phase 4 gap) |
| [#169](https://github.com/th3w1zard1/ModSync/pull/169) | MERGED | FOMOD post-download GUI + CLI (living plan still says “in PR #169” — stale) |
| [#170](https://github.com/th3w1zard1/ModSync/pull/170) | OPEN | Fail-closed FOMOD validate/install gate |
| [#171](https://github.com/th3w1zard1/ModSync/pull/171) | OPEN | Paste guide + draft instructions (STRATEGY track; may already be on tip elsewhere) |
| [#172](https://github.com/th3w1zard1/ModSync/pull/172) | OPEN | `modsync://` Phase 1 parse/CLI/handoff |
| [#173](https://github.com/th3w1zard1/ModSync/pull/173)–[#175](https://github.com/th3w1zard1/ModSync/pull/175) | OPEN | Docs consolidation / validation progress / test triage — not parity features |
| [#168](https://github.com/oldrepublicwizard/ModSync/pull/168) | CLOSED | Superseded by #176 managed wiring |
| [#169](https://github.com/oldrepublicwizard/ModSync/pull/169) | MERGED | FOMOD post-download GUI + CLI |
| [#170](https://github.com/oldrepublicwizard/ModSync/pull/170) | MERGED | Fail-closed FOMOD validate/install gate (U7 code) |
| [#171](https://github.com/oldrepublicwizard/ModSync/pull/171) | MERGED | Paste guide + draft instructions (U9) |
| [#172](https://github.com/oldrepublicwizard/ModSync/pull/172) | MERGED | `modsync://` Phase 1 parse/CLI/handoff |
| [#176](https://github.com/oldrepublicwizard/ModSync/pull/176) | MERGED | Parity ports foundation + managed install wiring + `modsync://` Phase 2 |
| [#177](https://github.com/oldrepublicwizard/ModSync/pull/177)–[#181](https://github.com/oldrepublicwizard/ModSync/pull/181) | MERGED | U3 CLI, KB audit, U5 uninstall, U4 decision B, U6 patcher provenance |

## 2. Capability matrix (important only)

Expand All @@ -69,17 +70,17 @@ endorsements UI, plugin images, save-game isolation, Steam Workshop, etc.
| `nxm://` Mod Manager Download | ● | ● | — | Shipped (#155–#164) | Low (macOS `.app` release bundling residual) |
| Nexus update checks / badges | ● | ○ | — | Shipped core + badges (#156/#167) | Low (persist cache; endorse deferred) |
| Install profiles / loadouts | ○ | ● | — | Shipped (#157); no save isolation | Medium (wizard hooks) |
| Non-destructive deploy (hardlink/copy) | ● | ● | — | Engine shipped (#158); **not wired to install** | **High** (#168) |
| Per-mod uninstall / purge | ● | ● | — | Engine APIs only; no GUI | **High** |
| Non-destructive deploy (hardlink/copy) | ● | ● | — | Engine (#158) + install wiring (#176) + CLI (#177) | Low (managed VFS DryRun option A deferred) |
| Per-mod uninstall / purge | ● | ● | — | GUI + Deployed badge (#179) | Low |
| File conflict analysis | ○ | ● | — | Analyzer + dialog shipped | Medium (badges / ValidatePage) |
| FOMOD configure | ● | ● | — | Parser + dialog + post-download (#169); gate in #170 | Medium until #170 lands |
| Instruction / patch execute (TSLPatcher) | — | — | ● | Shipped via Patch + Resources | Low (managed provenance incomplete) |
| Guide ingest → instructions | — | — | — | STRATEGY unique; paste/draft shipped on vision tips | Medium until on `master` |
| FOMOD configure | ● | ● | — | Parser + dialog + post-download (#169); **fail-closed gate Merged (#170)** | Low |
| Instruction / patch execute (TSLPatcher) | — | — | ● | Shipped via Patch + Resources | Low (U6 live-hash provenance #181; CAS restore deferred) |
| Guide ingest → instructions | — | — | — | Paste/draft on master (#171); guide ports (#176) | Low |
| Guide emit | — | — | — | `GenerateModDocumentation` shipped | Low |
| Share-a-build deep link | ○ | ○ | — | `modsync://` Phase 1 in #172; OS consume open | Medium |
| Share-a-build deep link | ○ | ○ | — | Phase 1 (#172) + Phase 2 consume/OS reg (#176); Settings toggle deferred | Low |
| Multi-author publish/share | — | — | — | Merge/profiles only | Medium (stub plan 003) |
| Dry-run / VFS validate | ○ | ● | ○ | Classic VFS validation shipped; managed staging not modeled | Medium |
| Agent/CLI parity for above | — | — | — | Strong for validate/install/download; gaps on managed/uninstall GUI | Medium |
| Dry-run / VFS validate | ○ | ● | ○ | Classic VFS shipped; managed decision B (#180) | Medium (option A deferred) |
| Agent/CLI parity for above | — | — | — | Strong validate/install/download + `--managed`/`--profile` (#177) | Medium (U10 polish) |

Legend: ● = core to that project’s important UX; ○ = partial/adjacent; — = N/A.

Expand Down Expand Up @@ -110,7 +111,7 @@ Place under `src/ModSync.Core/` (suggested folders; names illustrative):
|------|----------------|------------------------|
| `IDownloadProvider` / handler chain | Resolve URL → archive (HTTP, Nexus, nxm, Mega, …) | `IDownloadHandler`, `DownloadHandlerFactory` |
| `IProtocolHandler` | Parse + register OS schemes (`nxm`, `modsync`) | `NxmUrl`; GUI `NxmProtocolRegistrationService`; upcoming `ModSyncUrl` |
| `IInstallBackend` | Classic direct-to-game vs managed stage+deploy | `InstallationService` + `DeploymentService` (+ #168 `ManagedInstallSession`) |
| `IInstallBackend` | Classic direct-to-game vs managed stage+deploy | `InstallationService` + `DeploymentService` (+ #176 `ManagedInstallSession`) |
| `IDeploymentStore` | Manifests, uninstall, purge | `DeploymentService` |
| `IProfileStore` | Named loadouts | `ProfileService` |
| `IConflictAnalyzer` | Multi-writer attribution | `FileConflictAnalyzer` |
Expand Down Expand Up @@ -158,20 +159,20 @@ Place under `src/ModSync.Core/` (suggested folders; names illustrative):
| Classic install + validation | `InstallationService`, `InstallationValidationPipeline`, VFS dry-run |
| Patcher | HoloPatcher Resources + Patch instruction |
| Download multi-provider | `IDownloadHandler` family |
| Guide round-trip (on vision tips / open PRs) | Paste, `--parse-directions`, `GenerateModDocumentation` |
| Guide round-trip | Paste (#171), `--parse-directions`, `GenerateModDocumentation`, guide ports (#176) |
| Managed install + CLI | `ManagedInstallSession` (#176); `--managed`/`--profile` (#177) |
| FOMOD fail-closed gate | `FomodConfigurationGate` (#170); see `fomod-support.md` |
| `modsync://` Phase 1–2 | Parse/CLI/handoff (#172); consume + OS registration (#176); Settings toggle deferred |
| Patcher live-file provenance | Manifest hash snapshot (#181); CAS restore deferred |

### Top gaps (ordered)
### Top gaps (ordered) — residual only

1. **Managed deploy not on the install path** — engine idle; classic still mutates game dir (#168 / living-plan Phase 4).
2. **Uninstall / purge / deployment indicator GUI** — MO2/Vortex expectation unmet.
3. **Managed dry-run / VFS parity undecided** — validate may lie in managed mode.
4. **`modsync://` Phase 2** — OS registration + MainWindow consume (vision entry points).
5. **Patcher provenance in managed manifests** — uninstall incomplete without ImmutableCheckpoint.
6. **FOMOD fail-closed gate on master** — #170 open.
7. **NexusApiClient migration for download handler** — living-plan “Next”.
8. **Publish/share multi-author** — STRATEGY track; stub only.
9. **Conflict badges / ValidatePage integration** — analyzer exists; UX incomplete.
10. **Living plan freshness** — still lists FOMOD as “in PR #169” after merge.
1. **U6 CAS restore** — pre-image restore when patchers overwrite existing game files in place.
2. **U8 residual** — Settings UI toggle for `modsync://` OS registration + conflict probe polish.
3. **NexusApiClient migration for download handler** — living-plan “Next” / U10.
4. **Publish/share multi-author** — STRATEGY track; stub only.
5. **Conflict badges / ValidatePage integration** — analyzer exists; UX incomplete.
6. **Managed VFS DryRun option A** — decision B (#180) documents classic DryRun caveat; option A deferred.

## 5. Phased implementation units

Expand Down Expand Up @@ -207,6 +208,8 @@ this file; refresh Phase 4/6 status notes.
**Goal:** `--profile`, Core-readable `managedDeploymentEnabled`, shared session
for wizard and single-mod install.

**Status:** **Done** (#177).

**Depends on:** U2.

---
Expand All @@ -217,6 +220,8 @@ for wizard and single-mod install.
install-only managed validation in `validation-pipeline.md` /
`managed-deployment.md`.

**Status:** **Done** — decision B (#180); option A deferred.

**Depends on:** U2.

---
Expand All @@ -226,6 +231,8 @@ install-only managed validation in `validation-pipeline.md` /
**Goal:** Per-component uninstall, purge-all, deployment-state indicator on mod
list; CLI verbs if agent-parity requires.

**Status:** **Done** (#179).

**Depends on:** U2 (manifests written).

---
Expand All @@ -235,6 +242,8 @@ list; CLI verbs if agent-parity requires.
**Goal:** Record patcher outputs into deployment manifests so managed uninstall
does not orphan HoloPatcher writes.

**Status:** **Done** — live hash → manifests (#181); CAS restore deferred.

**Depends on:** U2; exercises `IPatcherEngine` seam.

---
Expand All @@ -244,6 +253,8 @@ does not orphan HoloPatcher writes.
**Goal:** Merge #170 (or equivalent); update
`vortex-mo2-feature-parity-living-plan.md` Phase 4/6; mark #169 merged.

**Status:** **Done** — gate Merged (#170); living-plan sync (this docs update).

**Depends on:** none (can parallel U2).

---
Expand All @@ -253,6 +264,8 @@ does not orphan HoloPatcher writes.
**Goal:** OS registration + MainWindow consume behind `IProtocolHandler`; keep
nxm adapter unchanged.

**Status:** **Done** per KB (#176); Settings toggle deferred (residual).

**Depends on:** #172 Phase 1.

---
Expand All @@ -262,6 +275,8 @@ nxm adapter unchanged.
**Goal:** Ensure ingest/emit sit behind `IGuideIngestor` / `IGuideEmitter`; land
#171 residuals if still open; agent-action-parity rows current.

**Status:** **Done** — ports (#176); paste/draft (#171).

**Depends on:** vision-branch content on master.

---
Expand Down Expand Up @@ -346,19 +361,17 @@ Tests: `ParityPortsTests`, `ModSyncUrlTests`.

Tests: `ManagedInstallSessionTests`, `ModSyncSettingsTests`, `DeploymentService` filters.

**FOMOD gate:** Install cores leave a clear insertion point for #170 fail-closed
`FomodConfigurationGate` inside `Install*CoreAsync` (same path for classic + managed).
Gate itself remains **U7 / #170** until that PR lands — do not bypass it when merging.
**FOMOD gate:** Fail-closed `FomodConfigurationGate` is **Merged (#170)** on both classic and managed install paths. U7 docs sync updates the [living plan](vortex-mo2-feature-parity-living-plan.md); KB `fomod-support.md` already documents gate behavior.

### Still deferred
### Unit status (2026-07-17 / U7)

| Unit | Status |
|------|--------|
| U3 CLI `--profile` + shared session polish | In PR (CLI `--managed`/`--no-managed`/`--profile`) |
| U4 Managed VFS / validation parity | Done (decision B — document classic DryRun caveat; option A deferred) |
| U5 Uninstall / purge GUI | Done ([#179](https://github.com/oldrepublicwizard/ModSync/pull/179)) |
| U6 Patcher provenance (ImmutableCheckpoint) | In PR (live game-file hash diff → manifest; CAS restore for in-place overwrites deferred) |
| U7 FOMOD gate (#170) + living-plan sync | Deferred (open PR) |
| U8 `modsync://` Phase 2 OS consume | Deferred |
| U9 Guide ports fully on master | Deferred |
| U10 Expansion polish | Deferred |
| U3 CLI `--managed` / `--no-managed` / `--profile` | **Done** ([#177](https://github.com/oldrepublicwizard/ModSync/pull/177)) |
| U4 Managed VFS / validation parity | **Done** (decision B — [#180](https://github.com/oldrepublicwizard/ModSync/pull/180); option A deferred) |
| U5 Uninstall / purge GUI | **Done** ([#179](https://github.com/oldrepublicwizard/ModSync/pull/179)) |
| U6 Patcher provenance (live hash → manifests) | **Done** ([#181](https://github.com/oldrepublicwizard/ModSync/pull/181); CAS restore for in-place overwrites deferred) |
| U7 FOMOD gate + living-plan sync | **Done** (gate [#170](https://github.com/oldrepublicwizard/ModSync/pull/170); living-plan / this docs sync) |
| U8 `modsync://` Phase 2 OS consume | **Done** ([#176](https://github.com/oldrepublicwizard/ModSync/pull/176); Settings toggle deferred — residual) |
| U9 Guide ports on master | **Done** (ports [#176](https://github.com/oldrepublicwizard/ModSync/pull/176); paste/draft [#171](https://github.com/oldrepublicwizard/ModSync/pull/171)) |
| U10 Expansion polish | Deferred (residual) |
34 changes: 17 additions & 17 deletions docs/plans/vortex-mo2-feature-parity-living-plan.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,12 @@ Architecture blueprint (Vortex + MO2 + HoloPatcher, ports/adapters, U1–U10):
| 1 | nxm protocol handler | Merged (#155–#164) |
| 2 | Nexus update checks | **Merged** (#156 core, #167 GUI badges) |
| 3 | Profiles | Merged (#157) |
| 4 | Managed deployment | **Engine** (#158) + **install wiring** on `feat/three-project-parity-foundation` (via `IInstallBackend`; see #168) |
| 4 | Managed deployment | **Merged** — engine (#158) + install wiring (#176) + CLI overrides (#177) + uninstall/purge GUI (#179) + patcher live-file provenance (#181); classic DryRun caveat documented (#180) |
| 5 | File conflicts | Core #160 + GUI #165 merged |
| 6 | FOMOD | Parser + installer dialog merged (#166); GUI + CLI post-download **merged** (#169); fail-closed gate in #170 |
| 6 | FOMOD | Parser + installer dialog (#166); GUI + CLI post-download (#169); **fail-closed gate merged** (#170); living-plan sync (this update / U7) |
| 7 | (roadmap tail) | Per slice plans |

## Delta update (2026-06-14)
## Delta update (2026-07-17 / U7)

### Landed

Expand All @@ -35,29 +35,29 @@ Architecture blueprint (Vortex + MO2 + HoloPatcher, ports/adapters, U1–U10):
- FOMOD installer dialog + parser stack (#166).
- Conflicts analysis GUI (#165).
- Nexus update check core (#156).
- Three-project ports + managed install wiring (#176).
- Guide paste / draft instructions (#171); guide ports on master (U9).
- CLI `--managed` / `--no-managed` / `--profile` process-local overrides (#177 / U3).
- Per-mod **Uninstall Managed Deployment** + **Deployed** badge (#179 / U5).
- Managed validation decision B — classic DryRun does not model staging (#180 / U4).
- Patcher live game-file hash snapshot → manifests (#181 / U6; CAS restore for in-place overwrites deferred).
- FOMOD fail-closed `FomodConfigurationGate` (#170 / U7 code); KB `fomod-support.md` already documents gate behavior.
- `modsync://` Phase 2 consume + OS registration builders (#176; Settings checkbox deferred) (U8).

### Partial

- Deployment: install wiring landed on parity-foundation branch (`IInstallBackend` /
`ManagedInstallSession`); uninstall/purge GUI and managed VFS dry-run still open.
- FOMOD post-download: GUI dialog + CLI orchestrator (`--fomod-choices`, settings `fomodPostDownloadMode`) **merged** (#169); validate/install gate still open (#170).
- U6 residual: CAS pre-image restore when patchers overwrite existing game files in place.
- U8 residual: Settings UI toggle for `modsync://` OS registration + conflict probe polish.
- Update checking: no endorsement UI; check results not persisted via `DownloadCacheService`.
- Desktop validation skipped for FOMOD prompts and update badges (headless agent).

### Next

1. Use Core ports from new GUI/CLI work (`docs/plans/2026-07-16-001-three-project-parity-architecture-plan.md`).
2. Land FOMOD fail-closed gate (#170 / U7) without bypassing managed install path.
3. Migrate `NexusModsDownloadHandler` to `NexusApiClient` when download handler branch is stable.
4. Managed deployment P2: dry-run/VFS staging parity or document install-only validation (U4).
5. `modsync://` Settings preference + conflict probe (consume + OS registration builders landed on `feat/three-project-parity-foundation`).
6. Per-component uninstall from mod list UI; patcher provenance (U6); CLI `--profile` parity (U3).

### Partial (this branch)

- **U8 consume:** `ModSyncHandoffQueue` / CLI `--modsync` / MainWindow fetch+load; `ModSyncProtocolRegistrationService` builders + Register/Unregister.
- **U5 purge:** Tools + context menu call `ManagedDeploymentLifecycle` / `DeploymentService.PurgeAsync`; status indicator dialog.
1. Residual gaps only — no open parity phase gates.
2. Pick one residual unit: Settings `modsync://` toggle, U6 CAS restore, or a high-signal agent-native gap from the latest audit.
3. Migrate `NexusModsDownloadHandler` to `NexusApiClient` when download handler branch is stable (U10).

## Superseded

- PR #162 closed; superseded by #166 (FOMOD dialog includes parser stack).
- PR #168 closed; superseded by #176 managed wiring.
Loading