17 KiB
Implementation Plan: Workspace, Tenant & Managed Object Lifecycle Governance v1
Branch: 262-lifecycle-governance-taxonomy | Date: 2026-05-01 | Spec: spec.md
Input: Feature specification from spec.md
Summary
Prepare one taxonomy-first lifecycle governance package that converts the deferred lifecycle candidate into an implementation-ready standards and contract slice without reopening runtime deletion, purge, or provider-specific rollout work. The narrow implementation path is to codify six lifecycle dimensions, their authoritative repo sources, transition-governance rules, export/retention/restoreability preconditions, and explicit follow-up boundaries in one new product standard plus one machine-readable contract artifact.
Repo truth already provides the inputs this slice needs: tenant lifecycle and canonical-view semantics in specs/143-tenant-lifecycle-operability-context-semantics, workspace commercial lifecycle in specs/251-commercial-entitlements-billing-state, provider-missing policy truth in specs/261-provider-missing-policy-visibility, reversible archive / irreversible force-delete in specs/091-backupschedule-retention-lifecycle, and current runtime lifecycle evidence in apps/platform/app/Models/Tenant.php, apps/platform/app/Models/Policy.php, apps/platform/app/Models/ReviewPack.php, apps/platform/app/Models/BackupSet.php, apps/platform/app/Models/RestoreRun.php, apps/platform/app/Console/Commands/PruneReviewPacksCommand.php, and apps/platform/config/tenantpilot.php.
V1 therefore stays deliberately non-runtime: no new app behavior, no migration, no new lifecycle service, no delete or purge flow, no panel/provider work, and no asset changes. It is a standards-track contract that later runtime specs must cite.
Technical Context
Language/Version: Markdown and YAML governance artifacts inside a PHP 8.4 / Laravel 12 repo
Primary Dependencies: existing specs 143, 251, 261, 091; product standards workflow in docs/product/standards/README.md; current lifecycle-bearing runtime models and commands as source truth only
Storage: none for product runtime; one standards document and one machine-readable contract artifact
Testing: manual artifact review plus targeted repo-search validation
Validation Lanes: N/A (docs/standards-only package)
Target Platform: repo standards and spec artifacts only
Project Type: Laravel monorepo with documentation and standards track
Performance Goals: N/A
Constraints: no runtime behavior change, no new persistence, no reinterpretation of current lifecycle fields, no new panel/provider/assets, and no hidden follow-up implementation
Scale/Scope: 1 new standards-track lifecycle contract, 6 lifecycle dimensions, 1 transition-governance matrix, 5 named follow-up slices, and bounded updates to candidate history
Likely Affected Repo Surfaces
docs/product/standards/README.mdas the existing landing zone for shared standards.docs/product/standards/lifecycle-governance.mdas the intended new standard for later implementation.docs/product/spec-candidates.mdto record explicit promotion history for the deferred candidate.specs/143-tenant-lifecycle-operability-context-semantics/spec.mdas the current tenant lifecycle authority.specs/251-commercial-entitlements-billing-state/spec.mdas the current workspace commercial lifecycle authority.specs/261-provider-missing-policy-visibility/spec.mdas the current provider-presence authority.specs/091-backupschedule-retention-lifecycle/spec.mdas the current reversible archive / irreversible force-delete pattern authority.apps/platform/app/Models/Tenant.php,apps/platform/app/Models/Policy.php,apps/platform/app/Models/ReviewPack.php,apps/platform/app/Models/BackupSet.php,apps/platform/app/Models/RestoreRun.php,apps/platform/app/Console/Commands/PruneReviewPacksCommand.php, andapps/platform/config/tenantpilot.phpas repo-real lifecycle inputs that the contract classifies but does not change.
Lifecycle Taxonomy Fit
- Treat lifecycle governance as a standards contract, not as a runtime engine or umbrella service.
- Keep the six lifecycle dimensions orthogonal:
- local record lifecycle
- provider presence lifecycle
- operator suppression lifecycle
- commercial/workspace lifecycle
- retention/compliance lifecycle
- restoreability lifecycle
- For each dimension, distinguish:
- current repo-real values and sources
- reserved follow-up values that are named for future work but not yet repo-real
- forbidden proxy meanings that later specs may not reuse locally
- Explicitly classify where current repo truth already exists versus where the taxonomy is defining a prerequisite for later runtime work.
- Treat
contracts/lifecycle-governance-taxonomy.yamlas the canonical machine-readable lifecycle matrix for this package; supporting prose artifacts must mirror it. - Classify
export requestedas a reserved retention/compliance value while keepingData Export Before Deletion v1as the dedicated runtime follow-up that fulfills that state before irreversible deletion.
Transition Governance Fit
- Build one transition matrix that answers, per lifecycle dimension:
- who owns the transition
- whether confirmation is required
- whether audit evidence is required
- whether shared
OperationRunexecution semantics are required - whether an
export requestedstate or other export-before-delete / retention preconditions must be satisfied first
- Reuse current repo truth instead of inventing new action families:
- direct audit-backed local mutation already proven by Spec 091
- provider observation transitions already bounded by Spec 261
- commercial-workspace gating already bounded by Spec 251
- canonical-view legitimacy already bounded by Spec 143
- Do not let the matrix imply runtime behavior beyond those current boundaries.
UI / Surface Guardrail Plan
- Guardrail scope: workflow-only guardrail change
- Native vs custom classification summary: N/A
- Shared-family relevance: status vocabulary, destructive-action naming, audit wording, retention wording, restoreability claims
- State layers in scope: none
- Audience modes in scope: N/A
- Decision/diagnostic/raw hierarchy plan: N/A
- Raw/support gating plan: N/A
- One-primary-action / duplicate-truth control: the package states lifecycle meaning once per dimension and forbids duplicate cross-dimension summaries
- Handling modes by drift class or surface: review-mandatory
- Repository-signal treatment: review-mandatory because this package sets a new cross-domain taxonomy
- Special surface test profiles: N/A
- Required tests or manual smoke: manual artifact review only
- Exception path and spread control: none; any runtime scope added here is out-of-scope drift
- Active feature PR close-out entry: Guardrail
Shared Pattern & System Fit
- Cross-cutting feature marker: yes
- Systems touched: lifecycle-bearing specs, product standards workflow, audit naming, and future destructive or retention-sensitive follow-up specs
- Shared abstractions reused: current specs, current standards workflow,
BadgeCatalog/BadgeRenderer,AuditLog, and the shared OperationRun UX contract as referenced authorities only - New abstraction introduced? why?: one governance contract only; no new runtime abstraction
- Why the existing abstraction was sufficient or insufficient: the repo already has enough bounded lifecycle slices, but not enough shared classification to stop future overlap
- Bounded deviation / spread control: none planned
OperationRun UX Impact
- Touches OperationRun start/completion/link UX?: yes, as a rule-setting artifact only
- Central contract reused: shared OperationRun UX contract remains authoritative
- Delegated UX behaviors: later lifecycle slices must delegate any queued, long-running, or remote destructive flow to the shared OperationRun path; this package does not add a new run type
- Surface-owned behavior kept local: later runtime surfaces remain responsible for their own initiation UI once the taxonomy tells them which safeguard path applies
- Queued DB-notification policy: unchanged
- Terminal notification path: unchanged
- Exception path: none
Provider Boundary & Portability Fit
- Shared provider/platform boundary touched?: yes
- Provider-owned seams: provider proof of object presence, subtype filtering, and hard-deletion evidence
- Platform-core seams: archive versus delete semantics, suppression, retention, restoreability, commercial suspension, and audit/export preconditions
- Neutral platform terms / contracts preserved:
provider missing,archived,retained,purge due,restorable,metadata only,suspended read-only - Retained provider-specific semantics and why: provider-specific hard deletion remains reserved because the repo does not yet have a generalized proof path for it
- Bounded extraction or follow-up path:
follow-up-specfor explicit provider-deleted semantics and broader managed-object rollout
Constitution Check
GATE: Must pass before Phase 0 research. Re-check after Phase 1 design.
- Inventory-first / snapshot truth: PASS. The package classifies current inventory, backup, and historical restore truths without redefining them.
- Read/write separation: PASS. No write path is introduced.
- Graph contract path: PASS. No new Graph family or provider behavior is introduced.
- Deterministic capabilities: PASS. No capability or role changes are introduced.
- Workspace and tenant isolation: PASS. Existing isolation rules remain referenced, not changed.
- RBAC-UX: PASS. Lifecycle state remains explicitly separate from authorization.
- Destructive confirmation standard: PASS. The package defines when later destructive work must require confirmation instead of implementing it now.
- Global search safety: PASS. No resource or search behavior changes are proposed.
- OperationRun / Ops-UX: PASS. The package only states when future lifecycle work must reuse the shared contract.
- Data minimization: PASS. No new runtime data or payload exposure is introduced.
- Test governance (TEST-GOV-001): PASS. The package leaves explicit validation and workflow outcomes despite being docs-only.
- Proportionality / no premature abstraction: PASS. One contract is the narrowest way to answer the deferred candidate questions.
- Persisted truth (PERSIST-001): PASS. No new product persistence.
- Behavioral state (STATE-001): PASS. The package classifies current and reserved states without implementing new runtime state machines.
- Provider boundary (PROV-001): PASS. Shared language stays provider-neutral.
- Filament / Laravel planning contract: PASS. Filament remains v5 on Livewire v4, provider registration remains in
apps/platform/bootstrap/providers.php, no globally searchable resource behavior changes, and no asset work is planned.
Gate evaluation: PASS.
- The package remains valid only if implementation stays on the standards and contract path.
- The gate fails if runtime deletion, purge, panel, provider, or lifecycle-engine work appears in this slice.
Post-design re-check: PASS. research.md, data-model.md, quickstart.md, contracts/lifecycle-governance-taxonomy.yaml, and checklists/requirements.md are present and aligned with the package.
Test Governance Check
- Test purpose / classification by changed surface: N/A - docs/standards package
- Affected validation lanes: N/A
- Why this lane mix is the narrowest sufficient proof: runtime proof is unnecessary because the slice changes no runtime behavior
- Narrowest proving command(s):
export PATH="/bin:/usr/bin:/usr/local/bin:$PATH" && cd /Users/ahmeddarrazi/Documents/projects/wt-plattform && rg -n -- "Workspace, Tenant & Managed Object Lifecycle Governance v1|Provider-Missing Managed Object Truth v1|Workspace & Tenant Closure Lifecycle v1|Data Export Before Deletion v1|Retention & Purge Governance v1|Restoreability Expiry & Evidence Retention v1" docs/product/spec-candidates.md specs/262-lifecycle-governance-taxonomyexport PATH="/bin:/usr/bin:/usr/local/bin:$PATH" && cd /Users/ahmeddarrazi/Documents/projects/wt-plattform && rg -n -- "draft|onboarding|active|archived|ignored_at|missing_from_provider_at|suspended|expired|retention" apps/platform/app/Models/Tenant.php apps/platform/app/Models/Policy.php apps/platform/app/Models/ReviewPack.php apps/platform/app/Models/BackupSet.php apps/platform/app/Models/RestoreRun.php apps/platform/app/Console/Commands/PruneReviewPacksCommand.php apps/platform/config/tenantpilot.php specs/143-tenant-lifecycle-operability-context-semantics/spec.md specs/251-commercial-entitlements-billing-state/spec.md specs/261-provider-missing-policy-visibility/spec.md specs/091-backupschedule-retention-lifecycle/spec.md
- Fixture / helper / factory / seed / context cost risks: none
- Expensive defaults or shared helper growth introduced?: no
- Heavy-family additions, promotions, or visibility changes: none
- Surface-class relief / special coverage rule: N/A
- Closing validation and reviewer handoff: reviewers must confirm the dimensions, authoritative sources, transition matrix, and follow-up boundaries stay aligned and non-runtime
- Budget / baseline / trend follow-up: none
- Review-stop questions: hidden runtime scope, future-state speculation, contradictory lifecycle meanings, missing transition safeguards, or missing follow-up boundaries
- Escalation path:
reject-or-splitif runtime work appears;follow-up-specif a new lifecycle family is discovered later - Active feature PR close-out entry: Guardrail
- Why no dedicated follow-up spec is needed: this package itself is the dedicated governance follow-up for lifecycle taxonomy; later runtime work remains separate
Rollout & Risk Controls
- Keep the contract standards-first and implementation-light.
- Keep all reserved future values clearly marked as follow-up only.
- Keep runtime authorities with their existing specs and models.
- Keep promotion history explicit so the repo does not treat this candidate as still merely deferred.
- Keep lifecycle vocabulary neutral and avoid provider-shaped truth at shared boundaries.
Close-Out Outcome
- Review outcome: Core Enterprise
- Workflow outcome: approve for implementation on the standards-and-contract path only
- Test-governance outcome: keep docs-only validation; no runtime lane expansion is required in this package
Implementation Close-Out Outcome
- Review outcome: Core Enterprise
- Workflow outcome: implemented on the standards-and-contract path only
- Test-governance outcome: keep docs-only validation; no runtime lane expansion was introduced
- Runtime impact: none; no application code, migration, Filament surface, provider behavior, asset, queue, or browser-visible flow was changed
Project Structure
Documentation (this feature)
specs/262-lifecycle-governance-taxonomy/
├── checklists/
│ └── requirements.md
├── plan.md
├── research.md
├── data-model.md
├── quickstart.md
├── contracts/
│ └── lifecycle-governance-taxonomy.yaml
└── tasks.md
Source Code And Standards Truth (repository root)
docs/product/
├── spec-candidates.md
└── standards/
├── README.md
└── lifecycle-governance.md # planned by this feature
apps/platform/
├── app/
│ ├── Console/Commands/PruneReviewPacksCommand.php
│ └── Models/
│ ├── AuditLog.php
│ ├── BackupSet.php
│ ├── Policy.php
│ ├── RestoreRun.php
│ ├── ReviewPack.php
│ └── Tenant.php
└── config/
└── tenantpilot.php
specs/
├── 091-backupschedule-retention-lifecycle/
├── 143-tenant-lifecycle-operability-context-semantics/
├── 251-commercial-entitlements-billing-state/
└── 261-provider-missing-policy-visibility/
Complexity Tracking
| Violation | Why Needed | Simpler Alternative Rejected Because |
|---|---|---|
| Cross-domain lifecycle taxonomy | The deferred candidate explicitly requires one shared answer before destructive or retention-sensitive runtime work continues | Local per-feature fixes would preserve the ambiguity the candidate is trying to remove |
Proportionality Review
- Current operator problem: future lifecycle work can still mislead operators by overloading fields or labels across tenant, workspace, provider presence, retention, and restoreability contexts
- Existing structure is insufficient because: current bounded specs each solve their local runtime problem but do not classify how their lifecycle meanings differ
- Narrowest correct implementation: add one standards document and one machine-readable contract that later runtime slices must cite
- Ownership cost: one shared vocabulary and one review step for lifecycle-bearing follow-up specs
- Alternative intentionally rejected: a runtime lifecycle framework or immediate archive/delete/closure implementation was rejected as broader than the deferred candidate allows
- Release truth: current-release truth only; the package classifies repo-real lifecycle signals and names reserved follow-up values without pretending that later runtime deletion, export, purge, or closure flows already exist