## Summary - Adds the Spec 431 Exchange PowerShell invocation gate and operation registration slice. - Introduces trusted provider operation start handling and read-only Exchange PowerShell runner abstractions. - Updates provider capability/readiness evaluation and coverage for Exchange PowerShell invocation safety. ## Verification - `cd apps/platform && ./vendor/bin/sail artisan test tests/Feature/Providers/ProviderCapabilityEvaluationTest.php tests/Feature/Providers/ProviderOperationCapabilityGateTest.php tests/Feature/TenantConfiguration/Spec431ExchangePowerShellInvocationGateTest.php tests/Unit/Providers/ProviderCapabilityRegistryTest.php tests/Unit/Providers/ProviderOperationStartGateTest.php tests/Unit/Support/TenantConfiguration/Spec430ExchangePowerShellCommandAllowlistTest.php tests/Unit/Support/TenantConfiguration/Spec431ExchangePowerShellOperationRegistrationTest.php tests/Unit/Verification/ManagedEnvironmentPermissionCapabilityMappingTest.php` - Result: 80 passed, 685 assertions. ## Product Surface / Ops - Rendered UI surface changed: N/A. - Filament/Livewire surface changed: N/A. - Deployment impact: config/runtime service changes only; no migrations, queues, or assets added. Co-authored-by: Ahmed Darrazi <ahmed.darrazi@live.de> Reviewed-on: #498
182 lines
5.7 KiB
Markdown
182 lines
5.7 KiB
Markdown
# Requirements Checklist: Exchange PowerShell Invocation Operation Registration and Execution Gate
|
|
|
|
**Purpose**: Validate Spec 431 preparation and later implementation against operation registration, invocation safety, no-promotion, and no-surface requirements.
|
|
**Created**: 2026-07-05
|
|
**Feature**: `specs/431-exchange-powershell-invocation-operation-registration-gate/spec.md`
|
|
|
|
## Applicability And Low-Impact Gate
|
|
|
|
- [x] CHK001 The change explicitly says no rendered UI surface is affected.
|
|
- [x] CHK002 The spec, plan, and tasks carry the same no-UI/no-product-surface decision.
|
|
- [x] CHK029 The spec includes exactly one coherent UI Surface Impact decision: `No UI surface impact`.
|
|
- [x] CHK037 Browser proof is `N/A - no rendered UI surface changed`.
|
|
- [x] CHK038 Human Product Sanity is N/A because no product surface changes.
|
|
- [x] CHK040 Completed historical specs were not rewritten or stripped of implementation history.
|
|
|
|
## Spec Package
|
|
|
|
- [x] `spec.md` exists.
|
|
- [x] `plan.md` exists.
|
|
- [x] `tasks.md` exists.
|
|
- [x] `checklists/requirements.md` exists.
|
|
- [x] `implementation-report.md` exists and records implementation validation.
|
|
|
|
## Scope
|
|
|
|
- [x] Only `transportRule`.
|
|
- [x] Only `remoteDomain`.
|
|
- [x] Only `inboundConnector`.
|
|
- [x] Only `Get-TransportRule`.
|
|
- [x] Only `Get-RemoteDomain`.
|
|
- [x] Only `Get-InboundConnector`.
|
|
- [x] No Teams.
|
|
- [x] No Exchange Admin API.
|
|
- [x] No live provider execution.
|
|
- [x] No evidence.
|
|
- [x] No compare/render.
|
|
- [x] No certification.
|
|
- [x] No restore.
|
|
- [x] No customer claim.
|
|
- [x] No UI.
|
|
- [x] No migration.
|
|
|
|
## Proportionality
|
|
|
|
- [x] New operation type justified.
|
|
- [x] New catalog entry justified.
|
|
- [x] New provider operation justified.
|
|
- [x] New capability justified.
|
|
- [x] New runner interface justified.
|
|
- [x] No mini-platform planned.
|
|
- [x] No new persisted status framework planned.
|
|
|
|
## Operation Registration
|
|
|
|
- [x] OperationRunType registered.
|
|
- [x] OperationCatalog registered.
|
|
- [x] ProviderOperationRegistry registered.
|
|
- [x] ProviderCapabilityRegistry registered.
|
|
- [x] OperationRunCapabilityResolver mapping exists.
|
|
- [x] Tests prove all mappings.
|
|
|
|
## Summary Counts
|
|
|
|
- [x] Existing allowed keys reused or new keys explicitly added.
|
|
- [x] SummaryCountsNormalizer preserves emitted keys.
|
|
- [x] Unknown keys remain dropped.
|
|
- [x] No raw output in summary counts.
|
|
- [x] No secrets in summary counts.
|
|
|
|
## Failure Sanitization
|
|
|
|
- [x] Invocation blocker reasons sanitized.
|
|
- [x] Invocation failure reasons sanitized.
|
|
- [x] Unknown failures sanitized.
|
|
- [x] Secret-like values redacted.
|
|
- [x] Raw stderr/stdout not persisted.
|
|
|
|
## Invocation Gate
|
|
|
|
- [x] Verified contract required.
|
|
- [x] Allowlisted command required.
|
|
- [x] OperationRun required before fake runner execution.
|
|
- [x] Provider scope required.
|
|
- [x] Capability required.
|
|
- [x] Actor capability is `Capabilities::PROVIDER_RUN` or a spec amendment documents a narrower dedicated capability.
|
|
- [x] Feature gate `tenantpilot.features.exchange_powershell_invocation` required and default disabled.
|
|
- [x] Provider identity/credential reference required or fake-runner-only mode documented.
|
|
- [x] Bypass calls rejected.
|
|
|
|
## Runner Safety
|
|
|
|
- [x] Structured runner interface.
|
|
- [x] Fake runner.
|
|
- [x] Production runner disabled/inert.
|
|
- [x] Raw command strings rejected.
|
|
- [x] Mutation commands rejected.
|
|
- [x] Unknown parameters rejected.
|
|
- [x] No shell execution in unit tests.
|
|
- [x] No Microsoft service calls in tests.
|
|
|
|
## OperationRun Safety
|
|
|
|
- [x] OperationRun created before fake invocation.
|
|
- [x] Status transitions owned by `OperationRunService`.
|
|
- [x] Numeric/safe summary counts only.
|
|
- [x] Safe failure category only.
|
|
- [x] `provider_connection_id` only in safe context.
|
|
- [x] No `provider_connection_id` migration.
|
|
- [x] No raw stdout/stderr.
|
|
- [x] No raw provider payload.
|
|
- [x] No secrets.
|
|
|
|
## Credential / Provider Scope
|
|
|
|
- [x] Provider connection scoped to workspace/environment.
|
|
- [x] Credential reference source is existing `ProviderIdentityResolver` / `ProviderConnection::credential` / `ProviderCredential` truth, not a new persistence path.
|
|
- [x] Missing credential reference blocks.
|
|
- [x] Unsupported credential kind blocks.
|
|
- [x] Missing permission evidence blocks or stays unvalidated.
|
|
- [x] Username/password blocked.
|
|
- [x] No plaintext secret fields.
|
|
- [x] Capability checks enforced.
|
|
|
|
## Shape Validation
|
|
|
|
- [x] Structured collection accepted.
|
|
- [x] Empty collection distinguished from permission failure.
|
|
- [x] Malformed result blocks.
|
|
- [x] Missing identity fields block or fail safe.
|
|
- [x] Text/scalar output fails safe.
|
|
|
|
## No Promotion
|
|
|
|
- [x] No evidence rows.
|
|
- [x] No raw evidence payload.
|
|
- [x] No normalized evidence payload.
|
|
- [x] No content-backed state.
|
|
- [x] No comparable state.
|
|
- [x] No renderable state.
|
|
- [x] No certified state.
|
|
- [x] No restore-ready state.
|
|
- [x] No customer-ready state.
|
|
|
|
## Product Surface
|
|
|
|
- [x] No routes planned.
|
|
- [x] No Filament pages planned.
|
|
- [x] No Livewire components planned.
|
|
- [x] No navigation planned.
|
|
- [x] No global search changes planned.
|
|
- [x] No asset changes planned.
|
|
- [x] Browser N/A.
|
|
|
|
## Architecture
|
|
|
|
- [x] Uses OperationRun architecture.
|
|
- [x] Uses provider operation/capability architecture.
|
|
- [x] Uses Coverage v2 source contract architecture.
|
|
- [x] No `tenant_id`.
|
|
- [x] No Exchange mini-platform.
|
|
- [x] No legacy shim.
|
|
- [x] No fallback reader.
|
|
|
|
## 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.
|
|
|
|
## Review Outcome
|
|
|
|
- [x] Review outcome class: implementation gate passed for backend-only slice.
|
|
- [x] Workflow outcome: keep.
|
|
- [x] Final note location: `implementation-report.md`.
|
|
|
|
## Final Candidate Gate
|
|
|
|
PASS for implementation. Runtime checklist items are checked against the implementation report and validation runs.
|