## Summary - add decision register summary output to environment review packs - update environment review evidence composition and localized summary rendering - add coverage for executive pack and derived review pack behavior - include spec artifacts for feature 308 ## Testing - cd apps/platform && ./vendor/bin/sail artisan test --compact tests/Feature/EnvironmentReview/EnvironmentReviewExecutivePackTest.php tests/Feature/ReviewPack/EnvironmentReviewDerivedReviewPackTest.php Co-authored-by: Ahmed Darrazi <ahmed.darrazi@live.de> Reviewed-on: #363
20 KiB
Implementation Plan: Decision Register Customer-Safe Summary & Review-Pack Inclusion
Branch: 308-decision-register-summary-review-pack | Date: 2026-05-15 | Spec: spec.md
Input: Feature specification from /specs/308-decision-register-summary-review-pack/spec.md
Summary
Add a bounded customer-safe Decision Register summary to existing released-review governance-package truth and review-derived Review Pack exports. The implementation should extend current Environment Review and Review Pack composition paths, not create a new decision store, export subsystem, customer approval workflow, or OperationRun lifecycle.
Technical Context
Language/Version: PHP 8.4.15, Laravel 12.52.0
Primary Dependencies: Filament 5.2.1, Livewire 4.1.4, Pest 4.3.1, Laravel Sail
Storage: PostgreSQL; existing JSONB fields on environment_reviews.summary, review_packs.summary, and generated files on the existing exports disk
Testing: Pest 4 feature tests and optional bounded browser smoke
Validation Lanes: confidence; browser only if rendered UI changes
Target Platform: Laravel Sail locally; Dokploy container deployment for staging/production
Project Type: single Laravel app under apps/platform
Performance Goals: Derived summary composition remains ordinary review/pack work; no new query-heavy global scan
Constraints: no migrations expected; no new assets; no new operation type; no customer-safe raw diagnostic leakage
Scale/Scope: one managed-environment released-review and review-pack flow at a time
UI / Surface Guardrail Plan
- Guardrail scope: changed customer-safe review/package surfaces and exported artifact content.
- Native vs custom classification summary: native/shared existing Filament surfaces plus existing export files.
- Shared-family relevance: customer review consumption, governance-package summary, Review Pack artifact truth, evidence/report disclosure, Decision Register context.
- State layers in scope: page, detail, artifact content; no shell change.
- Audience modes in scope: customer/read-only and operator-MSP.
- Decision/diagnostic/raw hierarchy plan: customer-safe decision summary first, existing detail/sections second, raw/support diagnostics absent from default customer paths.
- Raw/support gating plan: no raw OperationRun URLs, fingerprints, platform reason families, or provider payloads in customer-safe summary/export.
- One-primary-action / duplicate-truth control: preserve existing
Open review,Download governance package, andDownloadactions; summary content must not add peer operator-only actions. - Handling modes by drift class or surface: review-mandatory for customer-safe copy/export changes; report-only for unchanged Decision Register page.
- Repository-signal treatment: review-mandatory because this touches customer-safe review consumption and exported artifacts.
- Special surface test profiles: shared-detail-family plus standard-native-filament.
- Required tests or manual smoke: focused feature tests; existing bounded browser smoke if rendered customer workspace/review detail changes.
- Exception path and spread control: none planned.
- Active feature PR close-out entry: Guardrail / Smoke Coverage.
Shared Pattern & System Fit
- Cross-cutting feature marker: yes.
- Systems touched:
EnvironmentReviewComposer,EnvironmentReviewSectionFactory,CustomerReviewWorkspace,EnvironmentReviewResource,ReviewPackService,GenerateReviewPackJob,ReviewPackResource, review/review-pack tests. - Shared abstractions reused: existing
governance_packagesummary, existingauditor_ready_executive_export.v1delivery contract, existingReviewPackService::generateFromReview(), existingexecutive-summary.mdgeneration, existing BADGE-001 rendering if UI labels need badges. - New abstraction introduced? why?: none planned. Private methods in existing classes are acceptable if needed to keep summary derivation readable.
- Why the existing abstraction was sufficient or insufficient: Existing review and pack composition paths already own customer-safe summary and export truth; they lack explicit Decision Register follow-through proof. Existing operator register builder is intentionally too operator-focused for direct customer export.
- Bounded deviation / spread control: no public framework or new artifact family. Any new summary keys stay nested under existing review/pack summary payloads.
OperationRun UX Impact
- Touches OperationRun start/completion/link UX?: no new start/completion/link UX. Existing review-pack generation run behavior remains.
- Central contract reused: existing
ReviewPackService,GenerateReviewPackJob,OperationRunService, and existingOperationRunLinksusage where already present. - Delegated UX behaviors: existing Review Pack generation / run feedback only.
- Surface-owned behavior kept local: customer-safe copy may mention evidence/package availability, not run diagnostics.
- Queued DB-notification policy: N/A.
- Terminal notification path: existing Review Pack terminal handling remains.
- Exception path: none.
Provider Boundary & Portability Fit
- Shared provider/platform boundary touched?: no.
- Provider-owned seams: none.
- Platform-core seams: review/governance-package summary and review-pack export artifact content.
- Neutral platform terms / contracts preserved: governance decision, accepted risk, evidence basis, review, review pack, managed environment, workspace.
- Retained provider-specific semantics and why: existing finding/evidence titles may include provider context; this feature does not add provider coupling.
- Bounded extraction or follow-up path: none.
Constitution Check
- Inventory-first: PASS. The feature uses existing evidence/review snapshot truth; it does not query Graph or change inventory behavior.
- Read/write separation: PASS. Customer-safe summary is derived/read-only. Existing review-pack generation remains the only write path and already uses confirmation/authorization semantics where applicable.
- Graph contract path: PASS. No Graph calls or contracts are touched.
- Deterministic capabilities: PASS. Existing review/review-pack capabilities remain.
- RBAC-UX: PASS. Existing workspace/environment membership and review/review-pack policy behavior remain server-side boundaries.
- Workspace isolation: PASS. Summary derivation must scope to the released review workspace.
- Tenant/environment isolation: PASS. Summary derivation must scope to the managed environment under review.
- Run observability: PASS. Existing Review Pack
OperationRunremains; no new run type or local run UX. - TEST-GOV-001: PASS with focused feature coverage and optional bounded browser smoke.
- PROP-001 / BLOAT-001: PASS. No new table, enum family, service framework, or export family.
- PERSIST-001: PASS. Existing review and review-pack artifacts receive derived content; no new persisted truth.
- STATE-001: PASS. No new lifecycle/status family.
- UI-SEM-001: PASS. Customer-safe copy stays a derived summary, not a UI framework.
- XCUT-001: PASS. Reuses existing review and review-pack shared paths.
- PROV-001: PASS. No provider seam changes.
- UI-FIL-001: PASS. Existing Filament-native surfaces stay native/shared-primitives first; no ad-hoc CSS or new assets expected.
- DECIDE-AUD-001 / OPSURF-001: PASS. Customer-safe summary excludes raw/support/debug content by default.
Test Governance Check
- Test purpose / classification by changed surface: Feature tests for review summary composition, review-pack ZIP content, customer workspace/review-pack access, redaction, and isolation. Browser smoke only if rendered UI changes.
- Affected validation lanes: confidence; browser optional/bounded.
- Why this lane mix is the narrowest sufficient proof: Export content can be verified by reading generated ZIP entries; rendered summary and access boundaries can be verified through existing feature tests. A broad suite or new browser family is not justified.
- Narrowest proving command(s):
cd apps/platform && ./vendor/bin/sail artisan test --compact tests/Feature/EnvironmentReview/EnvironmentReviewExecutivePackTest.php tests/Feature/EnvironmentReview/EnvironmentReviewCreationTest.phpcd apps/platform && ./vendor/bin/sail artisan test --compact tests/Feature/ReviewPack/EnvironmentReviewDerivedReviewPackTest.php tests/Feature/ReviewPack/ReviewPackResourceTest.phpcd apps/platform && ./vendor/bin/sail artisan test --compact tests/Feature/Reviews/CustomerReviewWorkspacePageTest.php tests/Feature/Reviews/CustomerReviewWorkspacePackAccessTest.phpcd apps/platform && ./vendor/bin/sail artisan test --compact tests/Browser/Reviews/CustomerReviewWorkspaceSmokeTest.phpif rendered UI changescd apps/platform && ./vendor/bin/sail bin pint --dirty --format agentgit diff --check
- Fixture / helper / factory / seed / context cost risks: use existing helpers such as
composeEnvironmentReviewForTest()and review-pack factories; avoid widening defaults. - Expensive defaults or shared helper growth introduced?: no.
- Heavy-family additions, promotions, or visibility changes: none.
- Surface-class relief / special coverage rule: standard-native-filament plus shared-detail-family review/export checks.
- Closing validation and reviewer handoff: verify summary content, redaction, no raw diagnostics, no cross-scope leakage, unchanged destructive action confirmation, and unchanged asset strategy.
- Budget / baseline / trend follow-up: none expected.
- Review-stop questions: Are customer-safe summaries derived from the correct source? Are hidden records excluded? Is raw diagnostic detail absent? Did tests stay focused?
- Escalation path: none.
- Active feature PR close-out entry: Guardrail / Smoke Coverage.
- Why no dedicated follow-up spec is needed: This is a bounded productization pass over existing review/pack paths; broader localization, packaging cadence, and artifact lifecycle remain separate candidates.
Project Structure
Documentation (this feature)
specs/308-decision-register-summary-review-pack/
|-- spec.md
|-- plan.md
|-- tasks.md
`-- checklists/
`-- requirements.md
Source Code (likely affected later)
apps/platform/app/Services/EnvironmentReviews/
|-- EnvironmentReviewComposer.php
`-- EnvironmentReviewSectionFactory.php
apps/platform/app/Jobs/
`-- GenerateReviewPackJob.php
apps/platform/app/Services/
`-- ReviewPackService.php
apps/platform/app/Filament/Pages/Reviews/
`-- CustomerReviewWorkspace.php
apps/platform/app/Filament/Resources/
|-- EnvironmentReviewResource.php
`-- ReviewPackResource.php
apps/platform/tests/Feature/EnvironmentReview/
apps/platform/tests/Feature/ReviewPack/
apps/platform/tests/Feature/Reviews/
apps/platform/tests/Browser/Reviews/CustomerReviewWorkspaceSmokeTest.php
Structure Decision: Single Laravel/Filament application under apps/platform. Later implementation should modify only existing review, review-pack, and focused test surfaces unless repo inspection proves a smaller private helper is necessary.
Complexity Tracking
| Violation | Why Needed | Simpler Alternative Rejected Because |
|---|---|---|
| None planned | N/A | N/A |
Technical Approach
- Inspect current
EnvironmentReviewComposer::governancePackageSummary()andGenerateReviewPackJob::buildExecutiveEntrypoint()behavior. - Add or refine a customer-safe decision-summary shape under existing
EnvironmentReview.summary['governance_package']. - Keep existing
governance_decisionsentries aligned with accepted-risk / exception decision truth and add explicit count/empty/unavailable semantics if missing. - Ensure
GenerateReviewPackJobincludes the same summary insummary.jsonand readable markdown inexecutive-summary.md. - Update existing customer workspace/review detail presentation only if current surfaces do not expose the summary clearly.
- Preserve redaction through existing
redactReportPayload()behavior and add assertions forinclude_pii=false. - Add focused tests for positive, none, incomplete, cross-scope, and redaction scenarios.
Data / Model Implications
- No migration expected.
- No new model expected.
- No new enum/status family expected.
- Existing JSONB summary fields may receive additive keys:
governance_package.decision_summary- or a clarified
governance_package.governance_decisionsshape
- Existing ZIP entries remain preferred:
summary.jsonexecutive-summary.mdsections.json
If implementation finds a new table, new artifact file family, or new public contract is necessary, stop and update the spec/plan before coding further.
UI / Filament Implications
- Filament v5.2.1 and Livewire v4.1.4 remain the target.
- No panel provider changes; Laravel 12 provider registration remains in
bootstrap/providers.php. - No new globally searchable resource.
- No new destructive actions.
- Existing Review Pack destructive-like actions such as expire/regenerate must keep
->requiresConfirmation()and existing authorization. - No new assets; deployment
filament:assetsunchanged. - If UI changes are needed, prefer existing Filament sections/infolists/table entries and shared badge primitives.
Livewire Implications
- Existing Filament/Livewire pages may render updated summary content.
- No new Livewire component is expected.
- Avoid server-driven reactivity changes unless current page state already requires it.
RBAC / Policy Implications
- Reuse current review and review-pack policies/capabilities.
- No new capability constant expected.
- Customer-safe content must derive only after workspace and managed-environment scope are established.
- Non-member/not-entitled remains
404; member missing capability remains existing403. - Tests must cover at least one hidden/cross-scope omission path.
Audit / Logging / Evidence Implications
- No new audit action ID expected.
- Existing review pack request/export/download audit and telemetry remain.
- No secrets, raw JSON, fingerprints, internal reason ownership, or OperationRun URLs in customer-safe default content.
- Existing
ReviewPack,EnvironmentReview,EvidenceSnapshot, andOperationRunlinks remain traceability for operators.
Rollout Considerations
- No migration.
- No new env vars.
- Queue workers already process review-pack jobs; no new worker class expected beyond current job changes.
- Staging validation should generate at least one review-derived pack with decisions requiring awareness and one with no decisions.
- Production/Dokploy deploy impact is ordinary app code plus queue restart if job code changes.
Risk Controls
- Keep customer-safe summary derived and additive.
- Keep operator Decision Register unchanged unless a test proves a small source alignment issue.
- Reject raw OperationRun/proof URL exposure in customer-safe summary.
- Preserve non-certification disclosure in
executive-summary.md. - Keep tests focused on current review, pack, and customer workspace families.
Implementation Phases
Phase 1 - Discovery and Failing Tests
Confirm current summary/export behavior, then add focused tests for missing customer-safe decision summary, export inclusion, redaction, and cross-scope omission.
Phase 2 - Summary Composition
Extend existing Environment Review governance-package summary with bounded customer-safe decision summary content.
Phase 3 - Review Pack Inclusion
Ensure review-derived Review Pack summary.json and executive-summary.md include matching customer-safe decision summary content.
Phase 4 - Customer Surface Presentation
Expose the summary on existing customer-safe review surfaces only where needed and only through native/shared Filament patterns.
Phase 5 - Validation and Close-Out
Run focused Pest commands, optional bounded browser smoke, Pint dirty, and git diff --check. Record no new assets, no migrations, and no application implementation outside scope.
Spec Readiness Gate
spec.md,plan.md,tasks.md, andchecklists/requirements.mdexist.- Scope is bounded to existing Decision Register context, Environment Review summary, Customer Review Workspace/review detail, and review-derived Review Pack export.
- No open question blocks implementation.
- No new persisted entity, new status family, new public framework, new OperationRun type, or new asset bundle is planned.
- RBAC, isolation, auditability, OperationRun semantics, evidence/result truth, customer-safe disclosure, and test governance are addressed.
Implementation Close-Out
- Implementation status: Completed for Spec 308.
- Changed application files:
apps/platform/app/Services/EnvironmentReviews/EnvironmentReviewComposer.phpapps/platform/app/Services/Evidence/Sources/FindingsSummarySource.phpapps/platform/app/Jobs/GenerateReviewPackJob.phpapps/platform/resources/views/filament/infolists/entries/environment-review-summary.blade.phpapps/platform/lang/en/localization.phpapps/platform/lang/de/localization.php
- Changed tests:
apps/platform/tests/Feature/EnvironmentReview/EnvironmentReviewExecutivePackTest.phpapps/platform/tests/Feature/ReviewPack/EnvironmentReviewDerivedReviewPackTest.php
- No-migration status: No database migration, new model, new enum/status family, new persisted decision source, or new Review Pack status was introduced.
- No-asset status: No frontend asset registration was added; existing deployment
filament:assetsexpectations are unchanged. - OperationRun / audit status: No new OperationRun type, run-link surface, or audit action ID was added. Existing review-pack generation/download traceability remains unchanged.
- Validation results:
cd apps/platform && ./vendor/bin/sail artisan test --compact tests/Feature/EnvironmentReview/EnvironmentReviewExecutivePackTest.php tests/Feature/EnvironmentReview/EnvironmentReviewCreationTest.php- passed, 5 tests / 68 assertions.cd apps/platform && ./vendor/bin/sail artisan test --compact tests/Feature/ReviewPack/EnvironmentReviewDerivedReviewPackTest.php tests/Feature/ReviewPack/ReviewPackResourceTest.php- passed, 22 tests / 142 assertions.cd apps/platform && ./vendor/bin/sail artisan test --compact tests/Feature/Reviews/CustomerReviewWorkspacePageTest.php tests/Feature/Reviews/CustomerReviewWorkspacePackAccessTest.php- passed, 12 tests / 77 assertions.cd apps/platform && ./vendor/bin/sail artisan test --compact tests/Browser/Reviews/CustomerReviewWorkspaceSmokeTest.php- passed, 1 test / 46 assertions.- Additional regression lane:
cd apps/platform && ./vendor/bin/sail artisan test --compact tests/Unit/EnvironmentReview/EnvironmentReviewComposerTest.php tests/Feature/Evidence/ExceptionValidityEvidenceIntegrationTest.php tests/Feature/ReviewPack/ReviewPackValidRiskAcceptanceTest.php- passed, 6 tests / 27 assertions. - Additional RBAC/download lane:
cd apps/platform && ./vendor/bin/sail artisan test --compact tests/Feature/ReviewPack/ReviewPackDownloadTest.php tests/Feature/ReviewPack/ReviewPackRbacTest.php- passed, 20 tests / 49 assertions. cd apps/platform && ./vendor/bin/sail bin pint --dirty --format agent- passed.git diff --check- passed.
- Browser smoke result: Required because rendered customer review detail UI changed. Existing bounded customer workspace browser smoke passed.
- Post-implementation analysis: No confirmed in-scope findings remain after the first implementation/fix iteration.
- Remaining gaps: None inside Spec 308 scope. Localization adoption, artifact lifecycle/retention, governance-service packaging cadence, and AI-assisted review drafting remain separate follow-up candidates and were not implemented.