Automated PR created by Copilot: adds lifecycle governance taxonomy spec and supporting docs (spec 262). Includes new files under `specs/262-lifecycle-governance-taxonomy` and `docs/product/standards/lifecycle-governance.md`. Co-authored-by: Ahmed Darrazi <ahmed.darrazi@live.de> Reviewed-on: #318
244 lines
17 KiB
Markdown
244 lines
17 KiB
Markdown
# Implementation Plan: Workspace, Tenant & Managed Object Lifecycle Governance v1
|
|
|
|
**Branch**: `262-lifecycle-governance-taxonomy` | **Date**: 2026-05-01 | **Spec**: [spec.md](spec.md)
|
|
**Input**: Feature specification from [spec.md](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.md` as the existing landing zone for shared standards.
|
|
- `docs/product/standards/lifecycle-governance.md` as the intended new standard for later implementation.
|
|
- `docs/product/spec-candidates.md` to record explicit promotion history for the deferred candidate.
|
|
- `specs/143-tenant-lifecycle-operability-context-semantics/spec.md` as the current tenant lifecycle authority.
|
|
- `specs/251-commercial-entitlements-billing-state/spec.md` as the current workspace commercial lifecycle authority.
|
|
- `specs/261-provider-missing-policy-visibility/spec.md` as the current provider-presence authority.
|
|
- `specs/091-backupschedule-retention-lifecycle/spec.md` as 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`, and `apps/platform/config/tenantpilot.php` as 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.yaml` as the canonical machine-readable lifecycle matrix for this package; supporting prose artifacts must mirror it.
|
|
- Classify `export requested` as a reserved retention/compliance value while keeping `Data Export Before Deletion v1` as 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 `OperationRun` execution semantics are required
|
|
- whether an `export requested` state 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-spec` for 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-taxonomy`
|
|
- `export 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-split` if runtime work appears; `follow-up-spec` if 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)
|
|
|
|
```text
|
|
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)
|
|
|
|
```text
|
|
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
|