Savvi Studio

Modules Program Status (Track 1 -> Track 2)

Date: 2026-03-16

Scope

This document tracks progress for the agreed execution order:

  1. Lifecycle hardening
  2. Domain cutover workstream

Current Overall Status

  • Track 1 (lifecycle hardening): done.
  • Track 2 (domain cutover): done for the Products/Sponsors/Tasks/Teams wave.

Track 1: Lifecycle Hardening

Completed

  • Implemented true rollback apply behavior that avoids destructive uninstall/recreate collisions.
  • Added plan provenance tracking in lifecycle plans:
    • sourceCanonicalVersion now captured at plan creation time.
  • Added plan drift protection at apply time:
    • apply now verifies current installed canonical version matches the plan source version.
  • Hardened rollback semantics:
    • no-op rollback when already at target canonical version.
    • rollback resolves target manifest by canonical version.
  • Maintained upgrade compatibility:
    • upgrade planning remains valid even when an exact target canonical manifest is not currently materialized in known manifests.

Validation

  • Package typecheck passed:
    • pnpm tsc --noEmit --project configs/tsconfig.src-packages.json
  • Lifecycle integration suite passed:
    • pnpm -s exec vitest run --project integration-tests-node-postgresql integration-tests/modules-lifecycle.workflow.test.ts --silent

Newly Confirmed

  • Added lifecycle drift regression coverage in integration workflow tests.
  • Apply-time drift enforcement now rejects stale plans when installed canonical version changes after planning.
  • API lifecycle planning now exposes explicit plan metadata:
    • source/target canonical provenance
    • selected manifest version
    • version graph snapshot (canonical -> manifest versions)
    • created/expiry timestamps
  • Materialized lifecycle plans now enforce retention via expiry policy (15 minute TTL).
  • Version graph semantics are now deterministic when multiple manifest versions coexist under a canonical version (highest semantic version selected).

Remaining (Track 1)

  • None.

Track 2: Domain Cutover

Completed Prep Work

  • Story/test-data/model-type alignment and import-path modernization were completed as part of workspace typecheck cleanup.
  • Full workspace typecheck passes (pnpm typecheck).

Remaining Core Delivery (Main Track 2)

  • None for the four-domain cutover wave scope.

Current Track 2 Findings (Products Slice)

  • Router wiring exists for products in root API router.
  • Products domain service token/provider path is implemented (productServiceToken, provider registered in server app providers).
  • Products API now exposes canonical get, list, put, and del procedures.
  • Products hooks now call canonical tRPC mutations (trpc.products.put, trpc.products.del) instead of local mock persistence.
  • Entity edit plumbing now passes selected entity context into edit mutations, enabling id-targeted put semantics in products/sponsors hooks.
  • Products-targeted integration coverage now exists in integration-tests/products.router.test.ts and passes.
  • Products UI component verification now exists in packages/ui-domain-entities-components/products/tests/ProductsPage.test.tsx and passes.

Current Track 2 Findings (Sponsors Slice)

  • Sponsors domain service token/provider path is implemented and registered in server app providers.
  • Sponsors API now exposes canonical get, list, put, and del procedures.
  • Sponsors hooks now call canonical tRPC mutations (trpc.sponsors.put, trpc.sponsors.del) with id-aware edit behavior.
  • Sponsors-targeted integration coverage now exists in integration-tests/sponsors.router.test.ts and passes.
  • Sponsors UI component verification now exists in packages/ui-domain-sponsors-components/tests/SponsorsPage.test.tsx and passes.

Current Track 2 Findings (Tasks Slice)

  • Tasks API now exposes canonical get, list, put, and del procedures.
  • Tasks hooks now call canonical tRPC mutations (trpc.tasks.put, trpc.tasks.del) with id-aware edit behavior.
  • Tasks-targeted integration coverage now exists in integration-tests/tasks.router.test.ts and passes.
  • Tasks UI component verification now exists in packages/ui-domain-tasks-components/tests/TasksPage.test.tsx and passes.

Current Track 2 Findings (Teams Slice)

  • Teams API now exposes canonical get, list, put, and del procedures.
  • Teams hooks now call canonical tRPC mutations (trpc.teams.put, trpc.teams.del) with id-aware edit behavior.
  • Teams-targeted integration workflow coverage now exists in integration-tests/teams.router.workflow.test.ts and passes.
  • Teams membership router now includes concrete removeMember and cancelInvitation procedures, and Teams membership UI hook now uses canonical tRPC mutations for those actions.
  • Teams membership backend hardening is now implemented end-to-end:
    • inviteByEmail resolves existing users by email instead of placeholder IDs.
    • inviteToTeam is implemented as userId-based invitation flow.
    • membership finalize path now uses canonical predicate-based statement creation (no placeholder predicate IDs).
  • Teams UI component test suite is passing in browser project:
    • packages/ui-domain-teams-components/tests/TeamDialogs.test.tsx
    • packages/ui-domain-teams-components/tests/TeamFields.test.tsx
    • packages/ui-domain-teams-components/tests/TeamsTable.test.tsx
  • Cross-domain targeted integration rerun is passing for Products/Sponsors/Tasks/Teams + Teams membership workflow.
  • Cross-domain component verification rerun is passing for Products/Sponsors/Tasks/Teams.
  • Domain-slice legacy alias cleanup for Products/Sponsors/Tasks/Teams is complete.

Remaining (Track 2)

  • None for the four-domain wave scope.

Immediate Next (Track 2)

  • Program:
    • Keep these suites in regression runs as ongoing sentries (pnpm test:regression:track1-closeout, wired into CI integration job).

Risks and Constraints

  • Lifecycle versioning behavior still depends on available known manifests at runtime.
  • Domain cutover risk is primarily stale import paths and partial model drift in stories/tests/fixtures; mitigated by strict typecheck gates.
  1. Continue running the closeout sentry regression in routine CI and release checks.
  2. Start the next planned program wave outside Track 1/Track 2 closeout scope.