## Summary - add Spec 437 package for Exchange comparable promotion slice 1 - add ExchangePowerShellComparablePayloadBuilder for normalized-payload-only comparable artifacts - add focused Pest unit/feature coverage for comparable safety, determinism, redaction, and no product-surface promotion ## Validation - cd apps/platform && ./vendor/bin/sail bin pint --dirty --format agent: PASS - cd apps/platform && ./vendor/bin/sail artisan test --filter=Spec437 --compact: failed with Symfony Process signal 9 - cd apps/platform && php artisan test --filter=Spec437 --compact: PASS, 34 tests / 225 assertions - git diff --check: PASS ## Product Surface / Deployment - UI impact: N/A - no rendered UI surface changed - Browser proof: N/A - no rendered UI surface changed - Destructive/high-impact actions: none - Assets: none; no filament:assets requirement introduced - Deployment impact: no env vars, migrations, queues, scheduler, storage, assets, routes, jobs, listeners, commands, or Dokploy runtime behavior changes Co-authored-by: Ahmed Darrazi <ahmed.darrazi@live.de> Reviewed-on: #504
171 lines
6.6 KiB
Markdown
171 lines
6.6 KiB
Markdown
# Requirements Checklist: Spec 437 - Exchange Comparable Promotion Slice 1
|
|
|
|
**Purpose**: Validate Spec 437 scope, prerequisites, comparable-only safety gates, no-promotion posture, and preparation completeness before implementation.
|
|
**Created**: 2026-07-09
|
|
**Feature**: [spec.md](../spec.md)
|
|
|
|
Unchecked runtime proof items below are implementation gates, not preparation failures. They must be checked only after Spec 437 code and tests provide evidence.
|
|
|
|
## Prerequisites
|
|
|
|
- [x] Spec 436 PASS/merge-ready or merged state is required before implementation.
|
|
- [x] `transportRule` content-backed evidence prerequisite is required.
|
|
- [x] `remoteDomain` content-backed evidence prerequisite is required.
|
|
- [x] `inboundConnector` content-backed evidence prerequisite is required.
|
|
- [x] Spec 436 normalized payloads must be deterministic.
|
|
- [x] Spec 436 evidence must remain append-only.
|
|
|
|
## Scope
|
|
|
|
- [x] Comparable-only.
|
|
- [x] Only `transportRule`.
|
|
- [x] Only `remoteDomain`.
|
|
- [x] Only `inboundConnector`.
|
|
- [x] No renderable.
|
|
- [x] No certification.
|
|
- [x] No restore.
|
|
- [x] No customer claim.
|
|
- [x] No UI.
|
|
- [x] No jobs/schedules/listeners.
|
|
- [x] No migration.
|
|
|
|
## Comparable Input
|
|
|
|
- [x] Uses `normalized_payload` only.
|
|
- [x] Does not use `raw_payload`.
|
|
- [x] Does not use raw stdout/stderr.
|
|
- [x] Does not use PowerShell transcript.
|
|
- [x] Does not use OperationRun context.
|
|
- [x] Does not use logs.
|
|
- [x] Does not use report/review-pack output.
|
|
- [x] Stable material identity comes from `normalized_payload.source_identity`.
|
|
- [x] `payload_hash` is required before comparable output is derived.
|
|
- [x] `payload_hash` must be a valid SHA-256 hash before comparable output is derived.
|
|
- [x] `evidence_state = content_backed` is required before comparable output is derived.
|
|
- [x] `coverage_level = content_backed` is required before comparable output is derived.
|
|
- [x] `capture_outcome = captured` is required before comparable output is derived.
|
|
- [x] Safe evidence metadata does not override identity or provide material compare fields.
|
|
|
|
## Comparable Output
|
|
|
|
- [x] Deterministic.
|
|
- [x] Machine-readable.
|
|
- [x] Stable identity field included.
|
|
- [x] Stable identity exact value is not emitted.
|
|
- [x] Scoped HMAC identity anchor is emitted instead of an exact value or unsalted hash.
|
|
- [x] Material safe fields included.
|
|
- [x] Material safe fields pass target-specific value policies before exact output.
|
|
- [x] Volatile fields excluded.
|
|
- [x] Provider ordering deterministic.
|
|
- [x] Protected values redacted/omitted.
|
|
- [x] Unexpected exact protected/sensitive values block comparable output.
|
|
- [x] Malformed exact values on otherwise safe fields block comparable output.
|
|
- [x] No customer-facing prose.
|
|
- [x] No risk verdict.
|
|
- [x] No certification label.
|
|
|
|
## Target Comparable
|
|
|
|
- [x] `transportRule` comparable safe.
|
|
- [x] `remoteDomain` comparable safe.
|
|
- [x] `inboundConnector` comparable safe.
|
|
- [x] `remoteDomain` domain-only identity blocked.
|
|
- [x] `remoteDomain` display-only identity blocked.
|
|
- [x] `remoteDomain` unsafe identity variants are blocked case/separator-insensitively.
|
|
- [x] `inboundConnector` protected config not exposed.
|
|
- [x] `transportRule` sensitive values not exposed.
|
|
|
|
## Evidence Immutability
|
|
|
|
- [x] `raw_payload` unchanged.
|
|
- [x] `normalized_payload` unchanged.
|
|
- [x] `payload_hash` unchanged.
|
|
- [x] `operation_run_id` unchanged.
|
|
- [x] source metadata unchanged.
|
|
- [x] persisted `coverage_level` unchanged.
|
|
- [x] `TenantConfigurationResource.latest_*` state unchanged.
|
|
- [x] `TenantConfigurationResourceType.default_coverage_level` unchanged.
|
|
- [x] prior evidence rows not overwritten.
|
|
- [x] evidence remains append-only.
|
|
|
|
## Empty / Missing / Unsafe
|
|
|
|
- [x] Empty collection creates no comparable artifact.
|
|
- [x] Missing evidence creates no comparable artifact.
|
|
- [x] Unsafe identity creates no comparable artifact.
|
|
- [x] Blocked target creates no comparable artifact.
|
|
|
|
## No Promotion Beyond Comparable
|
|
|
|
- [x] No persisted comparable coverage-level promotion.
|
|
- [x] No renderable state.
|
|
- [x] No certified state.
|
|
- [x] No restore-ready state.
|
|
- [x] No customer-ready state.
|
|
- [x] No customer-claimable state.
|
|
- [x] No report output.
|
|
- [x] No Review Pack output.
|
|
- [x] No PDF output.
|
|
|
|
## Product Surface / Trigger
|
|
|
|
- [x] No routes.
|
|
- [x] No Filament pages.
|
|
- [x] No Livewire components.
|
|
- [x] No views.
|
|
- [x] No navigation.
|
|
- [x] No asset changes.
|
|
- [x] No global search changes.
|
|
- [x] No `CoverageV2ReadinessReadModel` render output.
|
|
- [x] No job trigger.
|
|
- [x] No schedule trigger.
|
|
- [x] No listener trigger.
|
|
- [x] Browser N/A.
|
|
|
|
## Architecture
|
|
|
|
- [x] Uses Coverage v2 architecture.
|
|
- [x] Uses Spec 436 normalized payloads.
|
|
- [x] Does not use `GenericPayloadNormalizer`.
|
|
- [x] Does not use `ExchangeTeamsComparablePayloadNormalizer` for Spec 436 Exchange PowerShell payloads.
|
|
- [x] No Exchange-specific compare table.
|
|
- [x] No `tenant_id` ownership truth.
|
|
- [x] No Exchange mini-platform.
|
|
- [x] No legacy shim.
|
|
- [x] No fallback reader.
|
|
- [x] No migration.
|
|
- [x] No new OperationRun type.
|
|
|
|
## Validation
|
|
|
|
- [x] Focused unit tests pass.
|
|
- [x] Focused feature tests pass.
|
|
- [x] Regressions pass.
|
|
- [x] Pint passes.
|
|
- [x] `git diff --check` passes.
|
|
- [x] `git status --short` documented.
|
|
|
|
## Product Surface Contract
|
|
|
|
- [x] No-legacy posture is explicit.
|
|
- [x] Product Surface Impact is `N/A - no rendered product surface changed`.
|
|
- [x] Browser proof is `N/A - no rendered UI surface changed`.
|
|
- [x] Human Product Sanity is `N/A - no product surface changed`.
|
|
- [x] Product Surface exceptions are `none`.
|
|
- [x] Implementation report fields are required.
|
|
- [x] Completed historical specs must not be rewritten.
|
|
|
|
## Review Outcome
|
|
|
|
- [x] Review outcome class: acceptable-special-case for preparation because scope is backend comparable-only and all product-surface paths are explicitly N/A.
|
|
- [x] Workflow outcome: keep.
|
|
- [x] Final note location: `specs/437-exchange-comparable-promotion-slice-1/implementation-report.md`.
|
|
|
|
## Final Candidate Gate
|
|
|
|
Preparation result: PASS.
|
|
|
|
Implementation PASS requires all runtime validation items above to be checked with evidence. PASS WITH CONDITIONS is allowed only for bounded follow-ups that do not weaken comparable determinism, redaction, evidence immutability, no-renderable posture, no-customer-output posture, no-product-surface posture, ownership, or no-mini-platform posture.
|
|
|
|
FAIL if renderable output is added; raw payload/stdout/stderr/transcript/OperationRun context is used as compare input; protected config leaks; evidence payload/provenance is mutated; certification/restore/customer claims appear; UI/routes/jobs/schedules/listeners are added; migration is added without amendment; `tenant_id` ownership truth is introduced; Exchange-specific compare table appears without approval; or tests do not prove comparable safety.
|