## 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
6.6 KiB
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
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
- Spec 436 PASS/merge-ready or merged state is required before implementation.
transportRulecontent-backed evidence prerequisite is required.remoteDomaincontent-backed evidence prerequisite is required.inboundConnectorcontent-backed evidence prerequisite is required.- Spec 436 normalized payloads must be deterministic.
- Spec 436 evidence must remain append-only.
Scope
- Comparable-only.
- Only
transportRule. - Only
remoteDomain. - Only
inboundConnector. - No renderable.
- No certification.
- No restore.
- No customer claim.
- No UI.
- No jobs/schedules/listeners.
- No migration.
Comparable Input
- Uses
normalized_payloadonly. - Does not use
raw_payload. - Does not use raw stdout/stderr.
- Does not use PowerShell transcript.
- Does not use OperationRun context.
- Does not use logs.
- Does not use report/review-pack output.
- Stable material identity comes from
normalized_payload.source_identity. payload_hashis required before comparable output is derived.payload_hashmust be a valid SHA-256 hash before comparable output is derived.evidence_state = content_backedis required before comparable output is derived.coverage_level = content_backedis required before comparable output is derived.capture_outcome = capturedis required before comparable output is derived.- Safe evidence metadata does not override identity or provide material compare fields.
Comparable Output
- Deterministic.
- Machine-readable.
- Stable identity field included.
- Stable identity exact value is not emitted.
- Scoped HMAC identity anchor is emitted instead of an exact value or unsalted hash.
- Material safe fields included.
- Material safe fields pass target-specific value policies before exact output.
- Volatile fields excluded.
- Provider ordering deterministic.
- Protected values redacted/omitted.
- Unexpected exact protected/sensitive values block comparable output.
- Malformed exact values on otherwise safe fields block comparable output.
- No customer-facing prose.
- No risk verdict.
- No certification label.
Target Comparable
transportRulecomparable safe.remoteDomaincomparable safe.inboundConnectorcomparable safe.remoteDomaindomain-only identity blocked.remoteDomaindisplay-only identity blocked.remoteDomainunsafe identity variants are blocked case/separator-insensitively.inboundConnectorprotected config not exposed.transportRulesensitive values not exposed.
Evidence Immutability
raw_payloadunchanged.normalized_payloadunchanged.payload_hashunchanged.operation_run_idunchanged.- source metadata unchanged.
- persisted
coverage_levelunchanged. TenantConfigurationResource.latest_*state unchanged.TenantConfigurationResourceType.default_coverage_levelunchanged.- prior evidence rows not overwritten.
- evidence remains append-only.
Empty / Missing / Unsafe
- Empty collection creates no comparable artifact.
- Missing evidence creates no comparable artifact.
- Unsafe identity creates no comparable artifact.
- Blocked target creates no comparable artifact.
No Promotion Beyond Comparable
- No persisted comparable coverage-level promotion.
- No renderable state.
- No certified state.
- No restore-ready state.
- No customer-ready state.
- No customer-claimable state.
- No report output.
- No Review Pack output.
- No PDF output.
Product Surface / Trigger
- No routes.
- No Filament pages.
- No Livewire components.
- No views.
- No navigation.
- No asset changes.
- No global search changes.
- No
CoverageV2ReadinessReadModelrender output. - No job trigger.
- No schedule trigger.
- No listener trigger.
- Browser N/A.
Architecture
- Uses Coverage v2 architecture.
- Uses Spec 436 normalized payloads.
- Does not use
GenericPayloadNormalizer. - Does not use
ExchangeTeamsComparablePayloadNormalizerfor Spec 436 Exchange PowerShell payloads. - No Exchange-specific compare table.
- No
tenant_idownership truth. - No Exchange mini-platform.
- No legacy shim.
- No fallback reader.
- No migration.
- No new OperationRun type.
Validation
- Focused unit tests pass.
- Focused feature tests pass.
- Regressions pass.
- Pint passes.
git diff --checkpasses.git status --shortdocumented.
Product Surface Contract
- No-legacy posture is explicit.
- Product Surface Impact is
N/A - no rendered product surface changed. - Browser proof is
N/A - no rendered UI surface changed. - Human Product Sanity is
N/A - no product surface changed. - Product Surface exceptions are
none. - Implementation report fields are required.
- Completed historical specs must not be rewritten.
Review Outcome
- Review outcome class: acceptable-special-case for preparation because scope is backend comparable-only and all product-surface paths are explicitly N/A.
- Workflow outcome: keep.
- 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.